3.string类对象的访问及遍历操作
函数名称 | 功能说明 |
---|---|
operator[] (重 点) | 返回pos位置的字符,const string类对象调用 |
begin+end | begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
rbegin+rend | rbegin获取最后一个字符的迭代器 + rend获取第一个字符上一个位置的迭代器 |
范围for | C++11支持更简洁的范围for的新遍历方式 |
void test1()
{
string s1 = "gxlgxlgxlgxlgxl";
cout << s1[0] << s1[1] << s1[2] << endl;
}
void test2()
{
string s1 = "gxlgxlgxlgxlgxl";
//string::iterator it = s1.begin();
auto begin = s1.begin();
auto end = s1.end();
cout << *begin << endl;
cout << *(end - 1) << endl;//end指向最后一个字符的下一个位置,这里减1取最后一个位置
while (begin != end)
{
cout << *begin << endl;
++begin;
}
}
void test3()
{
string s1 = "gxlgxlgxlgxlgxl";
auto rbegin = s1.rbegin();
auto rend = s1.rend();
cout << *(rend - 1) << endl;//rend指向第一个字符的前一个位置,
//但是在这个rend中我们想取第一个位置的字符要减1
cout << *rbegin << endl;//rebegin指向最后一个字符
while (rbegin != rend)
{
cout << *rbegin << endl;
++rbegin;
}//输出为从字符串从后往前访问,即rbegin+1 是在从后往前走,
//这也解释为何访问第一个位置要rend-1
}
void test4()
{
string s1 = "gxlgxlgxlgxlgxl";
for (auto ch : s1)
{
cout << ch << endl;
}
}
int main()
{
test1();
test2();
test3();
test4();
return 0;
}
4.string类对象的修改操作
函数名称 | 功能说明 |
---|---|
push_back | 在字符串后尾插字符c |
append | 在字符串后追加一个字符串 |
operator+= (重 点) | 在字符串后追加字符串str |
c_str(重点) | 返回C格式字符串 |
find + npos(重 点) | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的 位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr | 在str中从pos位置开始,截取n个字符,然后将其返回 |
5.string类非成员函数
函数 | 功能说明 |
---|---|
operator>> (重点) | 输入运算符重载 |
operator<< (重点) | 输出运算符重载 |
getline (重点) | 获取一行字符串 |
relational operators (重点) | 大小比较 |
operator+ | 尽量少用,因为传值返回,导致深拷贝效率低 |
上面的几个接口大家了解一下,下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的操作,这里不一一列举,大家在需要用到时不明白了查文档即可。
6.vs和g++下string结构的说明
注意:下述结构是在32位平台下进行验证,32位平台下指针占4个字节。
vs下string的结构
string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义 string中字符串的存储空间:
当字符串长度小于16时,使用内部固定的字符数组来存放 。
当字符串长度大于等于16时,从堆上开辟空间。
union _Bxty
{ // storage for small buffer or pointer to larger one
value_type _Buf[_BUF_SIZE];
pointer _Ptr;
char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。
其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量
最后:还有一个指针做一些其他事情。
故总共占16+4+4+4=28个字节。

g++下string的结构
G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:
1)空间总大小
2)字符串有效长度
3)引用计数
struct _Rep_base
{
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_refcount;
};
指向堆空间的指针,用来存储字符串。