一、string原理
std::string
是 STL 中的一个容器类,用于处理字符串数据。以下是 std::string
的一些基本原理:
- 动态数组:
std::string
内部通常使用动态数组(如char
数组)来存储字符。这意味着std::string
可以根据需要自动调整大小。 - 短字符串优化(SSO):为了提高小字符串的性能,
std::string
实现了短字符串优化。这意味着对于短字符串,std::string
可能不会使用动态分配的内存,而是在对象的内部存储空间中直接存储字符。 - 内存管理:
std::string
负责管理其内部字符数组的内存。当字符串增长时,std::string
会进行内存重新分配,并复制旧字符到新分配的内存中。 - 迭代器:
std::string
支持迭代器,允许用户使用迭代器遍历字符串中的字符。 - 容量和大小:
std::string
提供了.size()
方法来获取字符串的长度,以及.capacity()
方法来获取当前分配的内存大小。 - 构造函数和析构函数:
std::string
有多种构造函数,允许从不同的数据源创建字符串,如 C 风格的字符数组、另一个std::string
对象、字符等。析构函数负责释放std::string
占用的内存。 - 成员函数:
std::string
提供了丰富的成员函数,如append()
、insert()
、erase()
、find()
等,用于操作字符串。 - C++11 特性:从 C++11 开始,
std::string
支持移动语义,这意味着在某些情况下,std::string
对象可以高效地在函数间传递,而不需要复制整个字符串。 - 异常安全:
std::string
的操作通常是异常安全的,这意味着即使在操作过程中发生异常,std::string
对象也会保持在有效状态。 - 本地化:
std::string
支持本地化功能,可以与本地化相关的函数(如std::collate
)一起使用,以支持多语言环境。
二、string实战操作分析
1、输入
string s; cin >> s; getline(cin, s) ; //使用默认的'\n'作为终止符 getline(cin, s, '!') ; //以'!'作为终止符
2、复制
string s1 = "hello World" ; string s2 = s1 ; //"hello World" 复制, string s3(s1); //"hello World" 拷贝构造函数, string s4(s1, 2); //"llo World" 将s1的第2个位置到末尾当作字符串的初值 string s5(s1, 3, 5); //"lo Wo" 将s1的第2个位置开始的5个字符作为字符串的初值 string s8(5, 'a'); //“aaaaa” 生成一个字符串,包含5个c字符
3、连接
string s1 = "Hello" ; string s2 = "World" ;string s3, s4; s1 += s2 ; //"HelloWorld" 连接 s3 = string("aaa") + "bbb"; //"aaabbb" s4 = "aaa" + "bbb"; //错误, 必须转成string类型!!!!!
4、比较
string s1 = "hello" ; string s2 = "world" ; if(s1 < s2) cout<<"s1 < s2" ; //比较
5、倒置串
string s = "hello" ; reverse(s.begin(), s.end()) ; //需要包含algorithm头文件, #include<algorithm>
6、查找串
string s1 = "hhhelloworlddd" ; //位置从0 ~ 9 s1.find("w") ; // 7 找第1个w的位置 s1.find("w", 10) ; // -1 从第10个位置开始找w s1.find_first_of("o"); //6 找第1次出现"o"的位置 s1.find_first_of("o",7); //8 从s1的第7个位置开始查找 s1.find_first_not_of("h"); //3 找第1个不是"h"的字符的位置 s1.find_last_of("o"); //8 //从后面开始找"o" s1.find_last_of("o", 7); //6 //从后面7个字符中找"o"出现的位置 s1.find_last_not_of("d"); //10
7、替换和字串
string s1,s2,s3; s1 = "hello world!" ; s2 = s1.substr(3, 5); //"lo wo" 从第3个位置开始,往后5个字符 s3 = s1.substr(6); //"world!" 从第6个字符到末尾部分 s1.replace(2, 5, "tt"); //"hettorld" 从第2个位置,往后5个字符换成“tt”
8、修改字符串
①. append - 追加 string s = "hello" ; s.append("world") ; //将"world"追加到s中 ②. push_back - 追加字符到字符串 string s = "hello" ; s.push_back('!') ; //将'!'追加字符到字符串s中 ③. insert - 插入 string s = "hello" ; s.insert(2, "www") ; //将字符串"www"插入到字符串s中, 插入位置为2 ④. erase - 从字符串中擦除一些字符 string s = "hello" ; s.erase(1, 2) ; //从下标为1处向后擦去2个字符 ⑤. swap - 与另一字符串交换内容 string s1 = "hello" ; string s2 = "world" ; s1.swap(s2) ; //将s1与s2中的字符串进行交换
9、获取字符串状态
s.size() //返回字符串大小 s.length() //返回字符串长度 s.max_size() //返回字符串最大长度 s.clear() //清空字符串 s.empty() //判断字符串是否为空
10、string中的所有s1都替换成s2
#include <iostream> #include <string> using namespace std; //"12212"这个字符串的所有"12"都替换成"21" string& replace_all(string str, const string& old_value, const string& new_value) //替换为22211 { while (true) { string::size_type pos(0); if ((pos = str.find(old_value)) != string::npos) { str.replace(pos, old_value.length(), new_value); } else { break; } } return str; } string& replace_all_distinct(string str, const string& old_value, const string& new_value) //替换为21221 { for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) { if ((pos = str.find(old_value, pos)) != string::npos) { str.replace(pos, old_value.length(), new_value); } else { break; } } return str; } int main() { cout << replace_all(string("12212"), "12", "21") << endl; //22211 cout << replace_all_distinct(string("12212"), "12", "21") << endl; //21221 return 0; }