> 技术文档 > 《C++ string 完全指南:从基础到高效使用》

《C++ string 完全指南:从基础到高效使用》


《C++ string 完全指南:从基础到高效使用》


文章目录

  • 《C++ string 完全指南:从基础到高效使用》
  • 一、STL简介
  • 二、string类
    • 1.C语言中的字符串
    • 2.标准库中的string类
      • 2.1 auto关键字
      • 2.2 范围for
      • 2.3 string类的常用接口说明
        • 2.3.1 string迭代器(正向和反向)
        • 2.3.2 string类对象常见构造
        • 2.3.3 string类对象的容量操作
        • 2.3.3 string类对象的访问及遍历操作
        • 2.3.4 string类对象的修改操作
        • 2.3.5 string类非成员函数
  • 源代码展示
  • 总结

一、STL简介

STL是 C++标准库的重要组成部分 ,不仅是一个可复用的组件库,而且是
一个包罗 数据结构与算法的软件框架


《C++ string 完全指南:从基础到高效使用》


二、string类

1.C语言中的字符串

C语言中,字符串是以’\\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列
的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户
自己管理,稍不留神可能还会越界访问。


2.标准库中的string类

在使用string类时,必须包含 #include头文件以及using namespace std;


2.1 auto关键字

《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》

《C++ string 完全指南:从基础到高效使用》


2.2 范围for

《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》


2.3 string类的常用接口说明

2.3.1 string迭代器(正向和反向)

《C++ string 完全指南:从基础到高效使用》《C++ string 完全指南:从基础到高效使用》


2.3.2 string类对象常见构造

《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》


2.3.3 string类对象的容量操作

《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》

《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》《C++ string 完全指南:从基础到高效使用》


2.3.3 string类对象的访问及遍历操作

《C++ string 完全指南:从基础到高效使用》


2.3.4 string类对象的修改操作

《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》
《C++ string 完全指南:从基础到高效使用》

《C++ string 完全指南:从基础到高效使用》


2.3.5 string类非成员函数

《C++ string 完全指南:从基础到高效使用》

《C++ string 完全指南:从基础到高效使用》


源代码展示

代码如下(示例):

#include#include#includeusing namespace std;void Test1(){string s1 = \"hello wkm!\";//普通迭代器string::iterator it = s1.begin();//指向第一个位置while (it != s1.end()){cout << *it << \" \";++it;}cout << endl;const string s2 = \"hello wkm!\";//const对象//const 反向迭代器 不能改变字符串中的值string::const_iterator itt = s2.begin();//指向最后一个字符的下一个位置while (itt != s2.end()){cout << *itt << \" \";++itt;}}void Test2(){string s1 = \"hello wkm!\";//普通反向迭代器string::reverse_iterator rit = s1.rbegin();//指向最后一个字符位置while (rit != s1.rend()){cout << *rit << \" \";++rit;}cout << endl;const string s2 = \"hello wkm!\";//const对象//const 反向迭代器 不能改变字符串中的值string::const_reverse_iterator ritt = s1.rbegin();//指向最后一个字符的位置while (ritt != s1.rend()){cout << *ritt << \" \";++ritt;}}void Test3(){//1. 使用我们的默认构造函数,不需要传参。string s1;s1 = \"hello wkm!\";//2. 使用的是拷贝构造来初始化。string s2(s1);//3. 使用一个string的某段区间初始化,其中pos是字符串下标,npos是指无符号整数的最大值。string s3(s2, 1, 7);//4. 使用的是某个字符数组初始化。string s4(\"hello world!\");//5. 使用的是某个字符数组前n个字符来初始化string s5(\"hello world!\", 5);//6. 使用的是n个c字符初始化。string s6(7, \'a\');//7. 使用的是某段迭代器区间初始化。string s7(s1.begin(), s1.end());//赋值运算符重载初始化string s8 = \"hello wkm!\";cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;cout << s5 << endl;cout << s6 << endl;cout << s7 << endl;cout << s8 << endl;}void Test4(){string s(\"hello wkm!\");cout << s.size() << endl;//有效长度cout << s.length() << endl;//有效长度cout << s.capacity() << endl;//容量大小cout << s.max_size() << endl;//最大大小}void TestCapacity(){string s;size_t sz = s.capacity();cout << \"making s grow:\\n\";for (int i = 0; i < 100; ++i){s.push_back(\'c\');if (sz != s.capacity()){sz = s.capacity();cout << \"capacity changed: \" << sz << \'\\n\';}}}void TestEmpty(){string s1(\"\");//空串string s2(\"hello \");if (s1.empty()){cout << \"s1为空串\" << endl;}else{cout << \"s1不为空串\" << endl;}if (s2.empty()){cout << \"s2为空串\" << endl;}else{cout << \"s2不为空串\" << endl;}}void TestClear(){string s1(\"hello world!\");cout << \"s1的有效长度为:\" << s1.size() << endl;cout << \"s1的容量大小为:\" << s1.capacity() << endl;s1.clear();cout << \"s1的有效长度为:\" << s1.size() << endl;cout << \"s1的容量大小为:\" << s1.capacity() << endl;if (s1.empty()){cout << \"s1是空串\" << endl;}}void Test5(){string s1(\"hello world!\");cout << \"reserve测试:\" << endl;cout << s1 << endl;cout << \"s1的有效长度为:\" << s1.size() << endl;cout << \"s1的容量大小为:\" << s1.capacity() << endl;s1.reserve(5);cout << s1 << endl;cout << \"s1的有效长度为:\" << s1.size() << endl;cout << \"s1的容量大小为:\" << s1.capacity() << endl;s1.reserve(13);cout << s1 << endl;cout << \"s1的有效长度为:\" << s1.size() << endl;cout << \"s1的容量大小为:\" << s1.capacity() << endl;s1.reserve(25);cout << s1 << endl;cout << \"s1的有效长度为:\" << s1.size() << endl;cout << \"s1的容量大小为:\" << s1.capacity() << endl;cout << endl;cout << \"resize测试:\" << endl;string s2(\"hello world!\");cout << s2 << endl;cout << \"s2的有效长度为:\" << s2.size() << endl;cout << \"s2的容量大小为:\" << s2.capacity() << endl;s2.resize(5);cout << s2 << endl;cout << \"s2的有效长度为:\" << s2.size() << endl;cout << \"s2的容量大小为:\" << s2.capacity() << endl;s2.resize(10, \'x\');cout << s2 << endl;cout << \"s2的有效长度为:\" << s2.size() << endl;cout << \"s2的容量大小为:\" << s2.capacity() << endl;s2.resize(25, \'x\');cout << s2 << endl;cout << \"s2的有效长度为:\" << s2.size() << endl;cout << \"s2的容量大小为:\" << s2.capacity() << endl;}void Test6(){string s1(\"hello world!\");cout << s1 << endl;cout << \"s1的有效长度为:\" << s1.size() << endl;cout << \"s1的容量大小为:\" << s1.capacity() << endl;s1.reserve(100);//先扩容cout << \"扩容后s1的有效长度为:\" << s1.size() << endl;cout << \"扩容后s1的容量大小为:\" << s1.capacity() << endl;s1.shrink_to_fit();//再缩容cout << \"缩容后s1的有效长度为:\" << s1.size() << endl;cout << \"缩容后s1的容量大小为:\" << s1.capacity() << endl;}void Test7(){string s1(\"hello wkm!\");for (int i = 0; i < s1.size(); i++){cout << s1[i] << \" \";}cout << endl;for (int i = 0; i < s1.size(); i++){cout << s1.at(i) << \" \";}}void Test8(){string s1(\"hello wkm!\");cout << s1.front() << endl;cout << s1.back() << endl;}void Test9(){string s(\"hello wkm!\");//追加一个!s.push_back(\'!\');cout << s << endl;s += \'!\';cout << s << endl;s.insert(0, 1, \'!\');cout << s << endl;//追加一个字符串s.append(\"hello \");cout << s << endl;s += \"world!\";cout << s << endl;//在下标0处追加字符串s.insert(0, \"hello \");cout << s << endl;}void Test10(){string s1(\"hello world!\");string s2;//直接用s1替换s2s2.assign(s1);cout << s2 << endl;//用s1的某段区间替换s2s2.assign(s1, 6);cout << s2 << endl;string s3(\"i am wkm!\");//用s1替换掉2下标长度为2的区间s3.replace(2, 2, s1);cout << s3 << endl;//用字符数组前n个字符替换s3.replace(0, 2, \"hhhh\", 2);cout << s3 << endl;}void Test11(){string s(\"hello wkm!\");//删除最后一个字符s.pop_back();cout << s << endl;//删除迭代器所指字符s.erase(s.begin());cout << s << endl;//删除0下标长度为3的一段区间s.erase(0, 3);cout << s << endl;//删除一段迭代器区间s.erase(s.begin(), s.end() - 2);cout << s << endl;}void TestSwap(){string s(\"hello wkm!\");string p(\"hello world!\");cout << s << endl;cout << p << endl;s.swap(p);cout << s << endl;cout << p << endl;}void Test12(){string s(\"hello wkm!\");//在字符串s中寻找wsize_t pos = s.find(\'w\');//从下标6开始截取长度为5的字符串string str = s.substr(pos, 5);cout << str << endl;}void Test13(){string str(\"Please, replace the vowels in this sentence by asterisks.\");//从str字符串中任意匹配aeiousize_t found = str.find_first_of(\"aeiou\");//找不到返回nposwhile (found != string::npos){str[found] = \'*\';//从下一个位置找found = str.find_first_of(\"aeiou\", found + 1);}cout << str << endl;}int main(){//Test1();//Test2();//Test3();//Test4();//TestCapacity();//TestEmpty();//TestClear();//Test5();//Test6();//Test7();//Test8();//Test9();//Test10();//Test11();//TestSwap();//Test12();Test13();}

总结

本文介绍了string的使用,感谢你的关注