【文件属性】:
文件名称:定长字符串模板类
文件大小:8KB
文件格式:RAR
更新时间:2009-04-04 17:46:40
综合系统类
I.引言
在Basic(俺的入门语言),Pascal等语言中都提供了定长字符串类型,各有特色,Basic的
是长度固定,超出截断,不足补空格;;pascal的是最大长度限制在某个范围.
虽然定长字符串有这样那样的缺点(例如长度有限,弄不好会丢失数据;;)
定长字符串还是有一定的好处,主要是:
1.不分配在堆上,从而不会造成内存碎片
2.静态分配内存,分配速度快
因此我写了一个定长字符串类,用作轻量级的字符串.类似于pascal的定长字符串,也采用也采取饱和的方式来处理溢出.
II.简介
主要类有:
1.
template<;typename T,typename Traits=std::char_traits<;T>; >;
class basic_small_string_base;;
这是定长字符串的基类,适用于各种字符类型,当然也支持";火星人的三字节字符";.
模板类的代码主要实现在该类中.该类是抽象类,不能够实例化.
2.
template<;typename T, size_t MaxSize, typename Traits=std::char_traits<;T>; >;
class basic_small_string;; // : public basic_small_string_base<;T,Traits>;
特定长度的定长字符串模板类.如果C++标准支持模板typedef的话,下面的4的俩类就不用再写了,遗憾的是还不支持,所以他也是抽象类.//其实做成可实例化的类也没任何问题。
3.
typedef basic_small_string_base<;char, std::char_traits<;char>; >;
small_string_base;;
typedef basic_small_string_base<;wchar_t, std::char_traits<;wchar_t>; >;
small_wstring_base;;
针对char和wchar_t(我特讨厌这后面的_t这根尾巴)两种字符类型的基类的和默认traits
的typedef.写函数参数类型的时候可以少写几个字, ^=^
4.
template <;size_t MaxSize, typename Traits=std::char_traits<;char>; >;
class small_string;; // : public basic_small_string<;char, MaxSize,Traits>;
这是定长字符串的基类,适用于各种字符类型,当然也支持";火星人的三字节字符";.
模板类的代码主要实现在该类中.该类是抽象类,不能够实例化.
2.
template<;typename T, size_t MaxSize, typename Traits=std::char_traits<;T>; >;
class basic_small_string;; // : public basic_small_string_base<;T,Traits>;
特定长度的定长字符串模板类.如果C++标准支持模板typedef的话,下面的4的俩类就不用
再写了,遗憾的是还不支持,所以他也是抽象类.//其实做成可实例化的类也没任何问题。
3.
typedef basic_small_string_base<;char, std::char_traits<;char>; >;
small_string_base;;
typedef basic_small_string_base<;wchar_t, std::char_traits<;wchar_t>; >;
small_wstring_base;;
针对char和wchar_t(我特讨厌这后面的_t这根尾巴)两种字符类型的基类的和默认traits
的typedef.写函数参数类型的时候可以少写几个字, ^=^
4.
template <;size_t MaxSize, typename Traits=std::char_traits<;char>; >;
class small_string;; // : public basic_small_string<;char, MaxSize,Traits>;
template <;size_t MaxSize, typename Traits=std::char_traits<;wchar_t>; >;
class small_wstring;; // : public basic_small_string<;char, MaxSize, Traits>;
真正能实例化的ANSI和WCHAR版本的定长字符串类.
III.用法
该模板类用法和std::string一样,可以参考它的文档.另外为了兼容std::basic_string<;>;,
还提供了和std::string搭配的一些额外功能,比如函数的字符串参数都支持
std::basic_string.可以与std::basic_string<;>;进行比较,转换,连接等.
1.
包含头文件
#include";small_string.hpp";
2.引入cfc命名空间
using namespace;; // 可以略去
3.实例化对象
cfc::small_string<;16>; s=";hello";;; // 一个缓冲区长度为16的定长字符串,内容为";hello";
// 最大长度为15,而不是16,注意!
作局部变量时效率上基本上等于 char s[]=";hello";;;低于char *s=";hello";;;原因很简单.
可以和std::string协同操作:
std::string s3 = s;;
s = s3;;
4.作为函数参数
作为非模板函数的参数传递时,参数的类型应该写成cfc::small_string_base&或者
cfc::small_wstring_base& ,根据需要,可以加上const:
void foo(cfc::small_string_base& str)
{
str=";hello";;;
}
int main()
{
cfc::small_string<;32>; s;;
foo(s);;
}
其他插入,比较,删除等操作跟std::string一样
IV.实现
利用模板的最大缓冲区长度参数,实例化模板,把缓冲区作为数组直接建立在对象的内部.
为了减少代码膨胀,大部分功能都移入基类.
V.结尾.
由于时间仓促,经历有限,经验不足,缺点错误肯定不少,欢迎大家批评指正.
谢谢!
【文件预览】:
small_string
----test.cpp(2KB)
----small_string.dsw(547B)
----small_string.hpp(32KB)
----StdAfx.cpp(299B)
----StdAfx.h(667B)
----small_string.dsp(5KB)
网友评论
- 功能实现得很详细,但是采用hpp组织的代码稍显凌乱