C++ basic_string(字符串类模板)详解
"字符" 本身是个有趣的抽象概念。例如,在纸上或者屏幕上,字符 "C" 仅仅是一段曲线而已。在计算机中,用一个 8 Byte 存储该字符,并赋值 67;字符 "C" 还是拉丁字母的第三个字母;在化学专业,字符 "C" 是原子碳的缩写形式;在计算机学科中,字符 "C" 又被用来表示一种程序设计语言的名字。
template <class Ch> struct char_traits { } 所有字符特征类均定义在名称空间 std 中,标准的字符特征类由头文件 <String> 给出。通用字符串特征类 char_traits 本身不具有任何属性,只有针对特定字符类型的专门 char_traits 才具有属性。标准字符串模板的实例类 basic_string 依赖于诸多类型和函数。若一个类型作为 basic_string 字符类型,必须提供支持上述功能的字符特征类(char_traits)。 C++ 的字符串模板实例化类 basic_string 中,还集合了大量的字符串处理函数,与标准容器类似。该类模板的声明如下: template <class Ch,class Tr = char_traits <Ch>,class A=allocator <Ch>> class std::basic_string { public: ... }在上述模板声明中,第一个参数(class Ch)是说明单个字符(Ch)所属型别(class)。 第二个参数(class Tr = char_traits <Ch>)是特性类别,用以提供字符串类别中的所有字符核心操作。该特性类别规定了“复制字符”或“比较字符”的做法;如果不指定该特性类别,系统会根据现有的字符型别采用默认的特性类别。 第三个参数带有默认值(class A = allocator<Ch>),用以定义字符串类别所采用的内存模式,通常设定为“默认内存模型 allocator”。该模板及其相关功能都定义在名称空间 std 中,由头文件 <string> 给出,其中包含了两个定义类型,可以为最常用的串类型提供便于使用的名称,即 C++ STL 提供了两个 basic_string<> 实例化版本:
typedef basic_string <char> string; basic_string 和 vector 类似,而 basic_string 还提供典型的字符串操作,例如子串检索。basic_string 没有提供一组完整的操作函数。通常 string 不能直接使用数组或者 vector,为了更好地支持 string 的常见应用,程序员在实现过程中需要尽量减少复制。尤其对于较短的字符串,不应使用自由存储空间,但允许对较长的字符串进行简单修改。 basic_string<T> 没有虚函数,这点和其他标准库类型一致。当需要设计更复杂的文字处理类时,可考虑用它加以实现。 与其他标准容器相似,basic_string 提供了一组成员类型名,程序员能使用这些与串相关的类型。例如:
typedef Tr traits_type;
typedef basic_string <unsigned char> Ustring; 虽然字符串类 string 包含了诸多的成员和函数,但个别功能没能够实现,例如正则表达式和较复杂的文本处理功能。 总体而言,string 类似的字符串操作逐渐变得简单了。程序员可以定义 string 类型的对象、string 类的重载操作符和成员函数,这使字符串操作变得非常容易。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |