本文始发于水木清华BBS,转载请保留作者信息,谢谢
Auther: chen3feng (RoachCock@smth)
email: chen3feng@163.com mailto:chen3fengx@163.com chen3feng@hotmail.com [/url]
发信人: RoachCock (chen3feng), 信区: CPlusPlus
标 题: [代码]定长字符串模板类
发信站: BBS [url=http://dev.csdn.net/telnet:smth.org]水木清华站 (Sat Oct 26 19:32:50 2002), 站内信件
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.结尾.
由于时间仓促,经历有限,经验不足,缺点错误肯定不少,欢迎大家批评指正.
谢谢!
VI.源程序
源程序已提交给CSDN软件中心,名称为<定长字符串模板类>,类型为源代码,语言为C++.
另外为了方便,把uue格式的贴在下面:
// 用法: 把下面的所有内容存入扩展名为uue的文本文件,然后用winzip或者winrar打开
_=_
_=_ Part 001 of 001 of file small_string.zip
_=_
begin 666 small_string.zip
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
MSNJUH5>5E\M:>UC.2HY;LP%Y&`+C9J\I;HN1RV+MYSWZRTKEUEB;T;=3K=81
MM6?Y3J[3VDR&A7?/V7EB[Z1E+[!#=T!4O<#(+KENC`WVK+UR;DSRRA-=UN:!
M8U3?XJ?<M3M'S)@8.+Q^DUYTP^Y>X5G@U`$J^#=\QBX.*BS`G/G@O:+8+*A9
MCX;]RD1?'0M]_DB\I$%*Y3`@+_(.DRQ&\([)>(Z#]5@;L<GK>YB%SW[YP=]_
M]\G7O_KP:Z:VX/,O__"7C_[XP1>?_.?3;S[Z[/=__?B;CW_]^;^_^NK#WWSY
MR6__$?SYGY_^Z[,O_O2W#WZQL[,C8S;JKARHV43R6.T;I9E=<#J>P9I"&4!:
MR%:!(W9=6;ZD67]KM?(>92WJWE`?]`J*A"$M+NIAD1)K*0^%M2`')%J`\X94
MI"S&!XIV8O+"NN7#^RC>8M[6E[*BF3YZ3.%"?4EH<86@O"+;6)SR/*(^,=>E
M9P4+T_;IJ4*5A7*>9]7G(-%`M8:%RWBB&_G5RE:.-F;FINE><=NUF`KO<ZG6
MZBGU;5HAQ]$2'.)5VWX&;D%3M'"[D_N:/+6,5_#,=US'@@UD"WBZY'`\A([7
M<&L\1KA[\.S)P\>/!\_.WWOT[MN#=YX^'?P74$L#!`H``````,F46BT`````
M```````````-````<VUA;&Q?<W1R:6YG+U!+`0(4`!0````(`'NB5"T^QJGM
M:0$``)L"```5``````````$`(`"V@0````!S;6%L;%]S=')I;F<O4W1D069X
M+FA02P$"%``4````"`![HE0M:48"6\<````K`0``%P`````````!`"``MH&<
M`0``<VUA;&Q?<W1R:6YG+U-T9$%F>"YC<'!02P$"%``4````"`![HE0MH$")
MD-<````C`@``'0`````````!`"``MH&8`@``<VUA;&Q?<W1R:6YG+W-M86QL
M7W-T<FEN9RYD<W=02P$"%``4````"`!IE%<MSDZ5EG$$``!B$@``'0``````
M```!`"``MH&J`P``<VUA;&Q?<W1R:6YG+W-M86QL7W-T<FEN9RYD<W!02P$"
M%``4````"`#FHEHM>Y\P+O<"```?"0``%0`````````!`"``MH%6"```<VUA
M;&Q?<W1R:6YG+W1E<W0N8W!P4$L!`A0`%`````@`L*):+8"OX^)"$@``U($`
M`!T``````````0`@`+:!@`L``'-M86QL7W-T<FEN9R]S;6%L;%]S=')I;F<N
M:'!P4$L!`A0`"@``````R91:+0````````````````T````````````0`/]!
G_1T``'-M86QL7W-T<FEN9R]02P4&``````<`!P#G`0``*!X`````
`
end