基本操作
构造与初始化
- 默认构造:创建一个空字符串
string s;
- 从 C 风格字符串构造:
string s = "Hello";
- 从范围构造:
string s(begin, end);
- 从迭代器构造:
string s(it_begin, it_end);
- 从字符数组构造:
string s(arr, arr + size);
- 从重复字符构造:
string s(10, 'a');
- 从另一个字符串构造:
string s(other_string);
赋值与修改
- 赋值:
s = "new string";
或 s.assign("new string");
- 替换:
s.replace(pos, len, "replacement");
- 追加:
s += "extra";
或 s.append("extra");
- 插入:
s.insert(pos, "inserted text");
查询与检索
- 长度:
s.size();
或 s.length();
- 获取字符:
char c = s[pos];
或 char c = s.at(pos);
(注意:at
方法会检查边界) - 比较:
bool b = (s == t);
或 int cmp = s.compare(t);
- 查找:
size_t pos = s.find("search");
或 size_t pos = s.rfind("search");
- 查找字符:
size_t pos = s.find_first_of('c');
或 size_t pos = s.find_last_of('c');
高级功能
遍历与迭代
- 迭代器:
for (auto it = s.begin(); it != s.end(); ++it) { ... }
- 范围 for 循环:
for (const auto &ch : s) { ... }
操作符重载
- 加法:
string result = s1 + s2;
- 比较:
if (s1 == s2) { ... }
- 小于:
if (s1 < s2) { ... }
分割与连接
- 分割:
vector<string> tokens = split(s, ' ');
- 连接:
string result = join(tokens, " ");
转换与格式化
- 转换为小写:
transform(s.begin(), s.end(), s.begin(), ::tolower);
- 转换为大写:
transform(s.begin(), s.end(), s.begin(), ::toupper);
- 格式化输出:
stringstream ss; ss << "value: " << value; string output = ss.str();
易错点与混淆点
s.at(pos)
与 s[pos]
:s.at(pos)
会检查边界,超出范围抛出异常;s[pos]
不会检查,可能导致未定义行为。find
与 rfind
:find
从左向右查找,rfind
从右向左查找。==
与 compare
:==
比较字符串是否相等,compare
返回比较结果,可用于排序。size
与 length
:在 string
中这两个函数是等价的,都返回字符串长度。append
与 +=
:+=
操作符可以链式调用,而 append
不能。erase
与 clear
:erase
可以删除指定位置的字符或子串,clear
清空整个字符串。
示例代码
#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
vector<string> split(string str, char delimiter) {
vector<string> tokens;
string token;
istringstream tokenStream(str);
while (getline(tokenStream, token, delimiter)) {
tokens.push_back(token);
}
return tokens;
}
int main() {
string greeting = "Hello, World!";
cout << "Original: " << greeting << endl;
greeting.replace(7, 6, "Universe");
cout << "Modified: " << greeting << endl;
transform(greeting.begin(), greeting.end(), greeting.begin(), ::tolower);
cout << "Lowercase: " << greeting << endl;
int num = 42;
stringstream ss;
ss << "The answer is: " << num;
string formatted_output = ss.str();
cout << formatted_output << endl;
vector<string> tokens = split(formatted_output, ' ');
for (const auto &token : tokens) {
cout << token << endl;
}
return 0;
}