C++ string
### C++ `string` 类详解 #### 引言 在 C++ 编程语言中,`string` 类作为处理文本数据的重要工具,在实际开发中占据了举足轻重的地位。相较于传统的 `char*` 字符串,`string` 类提供了更加强大、安全且便捷的功能。本文将深入探讨 C++ `string` 类的基础知识、构造与析构方法、以及丰富的成员函数,帮助读者更好地理解和运用这一关键组件。 #### 包含头文件 为了在程序中使用 `string` 类型,首先需要包含相应的头文件: ```cpp #include <string> ``` 注意不要与 C 风格的字符串头文件 `<string.h>` 混淆。 #### 声明与初始化 声明一个 `string` 类对象非常直观: ```cpp std::string str; ``` 这将使用默认构造函数创建一个空字符串。`string` 类还提供了多种构造方式,包括但不限于: 1. **默认构造**: ```cpp std::string s; // 创建空字符串 ``` 2. **拷贝构造**: ```cpp std::string s1 = "Hello"; std::string s2(s1); // 复制构造 ``` 3. **指定初始子串**: ```cpp const char *src = "HelloWorld"; std::string s(src, src + 5); // "Hello" ``` 4. **指定范围构造**: ```cpp const char *src = "HelloWorld"; std::string s(src, 5); // "Hello" ``` 5. **初始化列表构造**: ```cpp std::string s{10, 'A'}; // "AAAAAAAAAA" ``` 6. **基于 C 风格字符串构造**: ```cpp const char *cstr = "Hello"; std::string s(cstr); ``` #### 成员函数详解 ##### 1. 赋值与修改 - **`assign()`**: 改变字符串内容。 ```cpp std::string s("World"); s.assign("Hello"); ``` - **`swap()`**: 交换两个字符串的内容。 ```cpp std::string s1 = "Hello"; std::string s2 = "World"; s1.swap(s2); ``` - **`+=`, `append()`, `push_back()`**: 在字符串末尾追加内容。 ```cpp std::string s = "Hello"; s += " World"; // 使用 += s.append("!"); s.push_back('!'); ``` - **`insert()`**: 在指定位置插入内容。 ```cpp std::string s = "HelloWorld"; s.insert(5, " "); ``` - **`erase()`**: 删除字符串中的部分或全部内容。 ```cpp std::string s = "HelloWorld"; s.erase(5, 1); // 删除索引 5 的字符 s.erase(); // 清空整个字符串 ``` - **`clear()`**: 清空字符串。 ```cpp std::string s = "Hello"; s.clear(); ``` - **`replace()`**: 替换字符串中的部分或全部内容。 ```cpp std::string s = "HelloWorld"; s.replace(5, 1, " "); ``` ##### 2. 连接 - **`+`**: 连接两个字符串。 ```cpp std::string s1 = "Hello"; std::string s2 = "World"; std::string s3 = s1 + s2; ``` ##### 3. 比较 - **`==`, `!=`, `<`, `<=`, `>`, `>=`, `compare()`**: 比较两个字符串。 ```cpp std::string s1 = "Hello"; std::string s2 = "World"; bool b = (s1 == s2); int result = s1.compare(s2); ``` ##### 4. 获取信息 - **`size()`, `length()`**: 返回字符串长度。 ```cpp std::string s = "Hello"; size_t len = s.size(); ``` - **`max_size()`**: 返回 `string` 类型能表示的最大长度。 ```cpp size_t maxSize = std::string::max_size(); ``` - **`empty()`**: 判断字符串是否为空。 ```cpp std::string s; bool b = s.empty(); ``` - **`capacity()`**: 返回已分配的内存大小。 ```cpp std::string s = "Hello"; size_t cap = s.capacity(); ``` - **`reserve()`**: 预先分配内存。 ```cpp std::string s; s.reserve(100); // 预留 100 个字符的空间 ``` ##### 5. 访问元素 - **`[]`, `at()`**: 访问单个字符。 ```cpp std::string s = "Hello"; char c = s[0]; char d = s.at(0); ``` ##### 6. 输入/输出 - **`>>`, `getline()`**: 从流中读取值。 ```cpp std::string s; std::cin >> s; // 读取单词 std::getline(std::cin, s); // 读取一行 ``` - **`<<`**: 将值写入流。 ```cpp std::string s = "Hello"; std::cout << s; ``` ##### 7. 字符串转换 - **`c_str()`**: 转换成 C 风格字符串。 ```cpp std::string s = "Hello"; const char *cstr = s.c_str(); ``` - **`copy()`**: 将字符串内容复制到指定位置。 ```cpp std::string s = "Hello"; char dest[6]; s.copy(dest, 5, 0); ``` - **`data()`**: 获取底层字符数组。 ```cpp std::string s = "Hello"; char *data = s.data(); ``` ##### 8. 子串操作 - **`substr()`**: 获取子字符串。 ```cpp std::string s = "HelloWorld"; std::string sub = s.substr(5, 5); // "World" ``` ##### 9. 查找 - **`find()`**, **`rfind()`**, **`search()`** 等用于查找子串的位置。 ```cpp std::string s = "HelloWorld"; size_t pos = s.find("World"); ``` ##### 10. 迭代器支持 - **`begin()`, `end()`**: 提供迭代器支持。 ```cpp std::string s = "Hello"; for (auto it = s.begin(); it != s.end(); ++it) { std::cout << *it; } ``` - **`rbegin()`, `rend()`**: 提供逆向迭代器支持。 ```cpp std::string s = "Hello"; for (auto rit = s.rbegin(); rit != s.rend(); ++rit) { std::cout << *rit; } ``` #### 总结 通过以上详尽的介绍,我们可以看到 C++ `string` 类提供了极其丰富的功能,使得字符串处理变得既简单又高效。无论是基本操作还是复杂的数据处理需求,`string` 类都能胜任。掌握这些知识点,将极大地提升开发者在日常编程中的效率和代码质量。