string类

更新时间:2024-03-09 01:41

C++javaVB等编程语言中的名词。 在javaC#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象

介绍

其中的string是以char作为模板参数的模板类实例,把字符串的内存管理责任由string负责而不是由编程者负责,大大减轻了C语言风格的字符串的麻烦。

std::basic_string提供了大量的字符串操作函数,如比较、连接、搜索、替换、获得子串等。并可与C语言风格字符串双向转换。std::basic_string属于C++ STL容器类,用户自定义的类也可以作为它的模板参数,因此也适用C++ STL Algorithm库。

std::basic_string类模板

std::basic_string类模板存储且操纵类似char的对象的序列。该对象类型的性质由特性类模板std::char_traits的实例来提供,并作为std::basic_string的第二个模板参数。

C++11标准规定:basic_string的元素是连续存储的。即对于basic_string s,有:&*(s.begin() + n) == &*s.begin() + n,其中n属于[0, s.size())。换句话说,指向s[0]的指针即为指向CharT[]数组的首元素指针。C++11已经禁止了写入时复制(copy-on-write)的实现,因为存在多线程安全问题。一般都采用了小字符串优化(SSO)实现,如Visual C++:

union _Bxty { // storage for small buffer or pointer to larger one _Elem _Buf[_BUF_SIZE]; _Elem *_Ptr; } _Bx; size_type _Mysize; // current length of stringsize_type _Myres; // current storage reserved for string

GCC从版本5开始,std::string不再采用COW策略。

C++17标准规定,basic_string是AllocatorAwareContainer, SequenceContainer与ContiguousContainer。

模板参数

成员类型

成员函数

下面列出所有成员函数,其中string是std::basic_string的简写:

字符访问

迭代器

容量

修改器

搜索

常量值

非成员的有关的全局函数

字面量

C++14标准定义了如下的std::basic_string字面量

示例:

构造hash值的函数

C++11标准引入了4个std::hash函数模板的特化。用于以string为键值的hash定址。

std::char_traits类

char_traits是一个traits类模板。用于抽象出给定字符类型的字符特性与字符串操作。char_traits用于明确(explicit)实例化一个std::basic_string类模板。

成员函数

例如,如果需要定义“两个字符相等”当且仅当“两个字符的大写形式相等”,就可以在std::char_traits之上派生定义一个类,重载定义eq、lt、compare、find四个静态成员函数。再用此特性类作为第二个模板参数去实例化std::basic_string类模板。

用法

c_str()成员函数返回string类的C语言风格字符串(即ASCII-零串)的指针,用于C语言字符串的互操作。如果不需要零结尾的字符串,那么成员函数data()返回不一定是0结尾的字符串的内存地址。

剖析

能够准确无误地编写出String类的构造函数拷贝构造函数赋值函数和析构函数的面试者至少已经具备了C++基本功的60%以上!在这个类中包括了指针成员变量m_data,当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数,这既是对C++程序员的基本要求,也是《Effective C++》中特别强调的条款。仔细学习这个类,特别注意加注释的得分点和加分点的意义,这样就具备了60%以上的C++基本功!

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}