体会string 的强大。现今世界的数据处理大部分就是字符串处理,作为使用STL的程序员自然应该去了解 string 这个特殊容器。
这里就不同篇介绍string 了,只给出常用部分函数接口的内部实现。在应用string 的时候,只需要包含头文件
C++ 标准中string 类的特性与 vector<> 很相似,有以下几点区别:string 总会在末尾存放NULL 字符;string 需要借助 char_traits<>::assign,char_traits<>::copy 和char_traits<>::move 来复制元素,另外string 还额外提供了一些接口函数。
string(basic_string)类空间的分配(构造和析构)和vector<> 很相似,这里就不说了。这里只介绍几个重要函数
1 | // ------------------------------------------------------------ |
一、string 赋值和追加
1 | //basic_string 赋值运算符重载 |
追加append()
1 | /*末尾追加[__first, __last)区间字符*/ |
有了前面 assign 和 append 两个函数,下面的接口基本上都是基于上面两个函数而来的
1 | //string += 运算符重载,实际是调用append函数 |
二、插入函数 insert
1 | /*插入函数:指定位置position插入[first,last)字符*/ |
\三、删除 erase**
1 | basic_string& erase(size_type __pos = 0, size_type __n = npos) { |
需要注意的是线性存储方式的容器中,erase 一个迭代器所指元素或所指区域元素的方法是将其erase 位置后面的元素拷贝到删除位置处,然后容器最后的元素(该元素其实是容器末端的重复元素),然后返回删除元素的下一个位置,其实迭代器还是指向原来的位置,只不过该位置上的元素变成了删除元素的下一个元素。
窥探string 的插入函数 insert 函数,你会发现将待插入元素插入指定位置之后,其指定位置后的元素也是整个拷贝到后续位置,事实上内部怎么操作的,我们不感兴趣,但我们需要了解的是经过删除和插入操作之后原指定位置的迭代器如何变化。
对于迭代器要理解这一点,对于线性存储方式的容器,如 vector、deque 尤其得注意这一点,贸然erase元素,处理不当极易造成程序崩溃。
建议这样处理:
1 | for (pos = str.begin(); pos != str.end();) |
string 的其余部分函数这里就不介绍了,具体可以查看 STL 源码 string,另外string 一些接口函数内部会调用 char_traits<> 的成员函数。