基本操作
构造与初始化
- 默认构造:创建一个空字符串
std::string s;
- 从 C 风格字符串构造:
std::string s = "Hello";
- 从范围构造:
std::string s(begin, end);
- 从迭代器构造:
std::string s(it_begin, it_end);
- 从字符数组构造:
std::string s(arr, arr + size);
- 从重复字符构造:
std::string s(10, 'a');
- 从另一个字符串构造:
std::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) { ... }
操作符重载
- 加法:
std::string result = s1 + s2;
- 比较:
if (s1 == s2) { ... }
- 小于:
if (s1 < s2) { ... }
分割与连接
- 分割:
std::vector<std::string> tokens = split(s, ' ');
- 连接:
std::string result = join(tokens, " ");
转换与格式化
- 转换为小写:
std::transform(s.begin(), s.end(), s.begin(), ::tolower);
- 转换为大写:
std::transform(s.begin(), s.end(), s.begin(), ::toupper);
- 格式化输出:
std::stringstream ss; ss << "value: " << value; std::string output = ss.str();
易错点与混淆点
s.at(pos)
与s[pos]
:s.at(pos)
会检查边界,超出范围抛出异常;s[pos]
不会检查,可能导致未定义行为。find
与rfind
:find
从左向右查找,rfind
从右向左查找。==
与compare
:==
比较字符串是否相等,compare
返回比较结果,可用于排序。size
与length
:在std::string
中这两个函数是等价的,都返回字符串长度。append
与+=
:+=
操作符可以链式调用,而append
不能。erase
与clear
:erase
可以删除指定位置的字符或子串,clear
清空整个字符串。
注意事项
- 性能考虑:避免在循环中频繁使用
+=
来拼接字符串,使用std::stringstream
或std::string::reserve
和std::string::append
可以提高效率。 - 异常安全:使用
at
而非[]
来访问字符串元素可以避免运行时错误。 - 字符串常量:如果字符串常量在多个地方使用,使用
const std::string
而不是 C 风格字符串可以避免内存泄漏和提高可读性。
示例代码
Cpp
深色版本
#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
int main() {
std::string greeting = "Hello, World!";
std::cout << "Original: " << greeting << std::endl;
// 修改字符串
greeting.replace(7, 6, "Universe");
std::cout << "Modified: " << greeting << std::endl;
// 转换为小写
std::transform(greeting.begin(), greeting.end(), greeting.begin(), ::tolower);
std::cout << "Lowercase: " << greeting << std::endl;
// 格式化输出
int num = 42;
std::stringstream ss;
ss << "The answer is: " << num;
std::string formatted_output = ss.str();
std::cout << formatted_output << std::endl;
return 0;
}