std::string 是 C++ 标准模板库(STL)中用于处理字符串的类,提供了丰富的成员函数和操作符来方便地操作字符串。以下是 std::string 的主要函数分类介绍:
1. 构造函数
- 默认构造函数:创建空字符串
std::string s1; - 从 C 字符串构造:
std::string s2("Hello"); - 从子串构造:
std::string s3("Hello World", 5); // "Hello" - 从字符填充构造:
std::string s4(5, 'A'); // "AAAAA" - 拷贝构造:
std::string s5(s2); - 移动构造(C++11):
std::string s6(std::move(s5)); - 迭代器范围构造:
std::string s7(s2.begin(), s2.end());
2. 容量相关函数
size()/length():返回字符串长度(字节数)。s1.size(); // 0empty():检查字符串是否为空。s1.empty(); // truecapacity():返回当前分配的存储空间大小。reserve(n):请求至少容纳n个字符的空间(避免重复分配)。shrink_to_fit()(C++11):请求减少容量以适应实际大小。max_size():返回字符串可能达到的最大长度。
3. 元素访问
operator[]/at():访问指定位置的字符(at()会检查边界)。char c = s2[1]; // 'e' char c2 = s2.at(1); // 同上,但越界时抛出 `std::out_of_range`front()/back():返回首/尾字符的引用。char first = s2.front(); // 'H'data():返回指向底层字符数组的指针(C++11 起保证以\0结尾)。c_str():返回 C 风格字符串(以\0结尾)。
4. 修改操作
-
赋值与交换:
operator=:赋值字符串、C 字符串或字符。assign():类似operator=,但更灵活(支持子串、填充等)。swap():交换两个字符串的内容(O(1) 复杂度)。s1.assign("World"); s1.swap(s2);
-
追加与连接:
operator+=:追加字符串、C 字符串或字符。append():类似operator+=,但支持更多参数(如子串)。push_back():追加单个字符。s1 += " C++"; s1.append(s2, 0, 3); // 追加 s2 的前 3 个字符
-
插入与删除:
insert():在指定位置插入字符、字符串或子串。erase():删除指定位置的字符或范围。clear():清空字符串(变为空字符串)。s1.insert(5, "11"); // 在位置 5 插入 s1.erase(5, 2); // 从位置 5 删除 2 个字符
-
替换:
replace():替换指定范围的子串。s1.replace(0, 5, "Hi"); // 将前 5 个字符替换为 "Hi"
5. 字符串操作
-
子串:
substr(pos, len):返回从pos开始、长度为len的子串。std::string sub = s2.substr(0, 5); // "Hello"
-
查找与搜索:
find()/rfind():查找子串或字符,返回位置(未找到返回npos)。find_first_of()/find_last_of():查找任意给定字符的首次/最后一次出现。find_first_not_of()/find_last_not_of():查找不在给定字符集中的字符。size_t pos = s2.find('o'); // 4
-
比较:
compare():比较字符串(返回<0、0或>0)。- 直接使用
==、!=、<等操作符。int result = s1.compare(s2);
6. 数值转换(C++11 起)
std::stoi()/std::stod():将字符串转换为整数或浮点数(需包含<string>)。std::to_string():将数值转换为字符串。int num = std::stoi("123"); std::string s = std::to_string(3.14);
7. 迭代器支持
begin()/end():返回正向迭代器。rbegin()/rend():返回反向迭代器。cbegin()/cend()(C++11):返回常量迭代器。
8. 其他实用函数
resize():调整字符串大小(可填充默认字符)。copy():将字符串内容复制到 C 风格数组(需指定目标缓冲区和大小)。
示例代码
#include <iostream>
#include <string>
int main() {
std::string s = "Hello";
s.append(" World").push_back('!');
std::cout << s.substr(0, 5) << std::endl; // "Hello"
std::cout << s.find('W') << std::endl; // 6
s.replace(6, 5, "C++");
std::cout << s << std::endl; // "Hello C++!"
return 0;
}
注意事项
- 性能:频繁修改字符串(如大量插入/删除)可能导致多次内存分配,建议用
reserve()预分配空间。 - 边界检查:
at()会检查边界,而operator[]不会(可能未定义行为)。 - C++11 改进:新增移动语义、
shrink_to_fit()、data()保证\0结尾等。
通过灵活组合这些函数,可以高效地处理字符串操作需求。

4203

被折叠的 条评论
为什么被折叠?



