<string>
是 C++ 标准库中提供的一个头文件,定义了 std::string
类,旨在处理和操作字符串数据。与传统的 C 风格字符串(即字符数组)相比,std::string
提供了更强大、灵活和安全的字符串处理功能。它使得字符串的操作更加高效且易于使用,避免了内存管理和边界检查等问题。
目录
<string>
头文件简介std::string
类模板std::string
的常见操作- 字符串查找与提取
std::string
的内存管理- C++11 新增的字符串操作
- 性能优化与注意事项
- 结论
1. <string>
头文件简介
在 C++ 中,<string>
头文件提供了一个名为 std::string
的类,该类用于表示和操作文本数据。与传统的 C 风格字符串(由字符数组表示)相比,std::string
类更易于使用,因为它管理内存,并自动扩展以适应所存储的字符串。
要使用 std::string
类,首先需要包含 <string>
头文件:
#include <string>
2. std::string
类模板
2.1 创建和初始化 std::string
可以通过多种方式创建和初始化 std::string
对象:
- 默认构造函数:创建一个空字符串。
- 初始化列表:通过字符数组或字面量初始化。
- 指定字符的重复:通过指定字符和重复次数初始化。
示例:
#include <iostream>
#include <string>
int main() {
// 默认构造,空字符串
std::string str1;
// 从字符串字面量创建
std::string str2 = "Hello, World!";
// 从字符数组创建
const char* hello = "Hello!";
std::string str3(hello);
// 使用指定字符初始化
std::string str4(5, 'A'); // "AAAAA"
std::cout << str2 << std::endl;
std::cout << str4 << std::endl;
return 0;
}
输出:
Hello, World!
AAAAA
3. std::string
的常见操作
3.1 字符串赋值和访问
std::string
提供了多种方式来赋值和访问字符串内容。
- 赋值:可以通过赋值运算符或
std::string::assign()
函数赋值。 - 访问字符:可以使用下标运算符
[]
或at()
来访问单个字符。
示例:
#include <iostream>
#include <string>
int main() {
std::string str = "Hello";
// 通过下标访问
std::cout << "Character at index 1: " << str[1] << std::endl; // e
// 使用 at() 访问
std::cout << "Character at index 2: " << str.at(2) << std::endl; // l
// 赋值
str = "World!";
std::cout << "New string: " << str << std::endl; // World!
return 0;
}
3.2 字符串连接和拼接
std::string
支持通过 +
运算符进行字符串拼接,也可以使用 append()
方法来连接字符串。
示例:
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello";
std::string str2 = " World!";
// 使用 + 运算符拼接
std::string result = str1 + str2;
std::cout << "Concatenated string: " << result << std::endl; // Hello World!
// 使用 append() 拼接
str1.append(str2);
std::cout << "Appended string: " << str1 << std::endl; // Hello World!
return 0;
}
3.3 字符串比较
std::string
提供了几种比较字符串的方式,包括 ==
、!=
、<
、<=
、>
和 >=
运算符。它们可以直接进行字符串的字典序比较。
示例:
#include <iostream>
#include <string>
int main() {
std::string str1 = "apple";
std::string str2 = "banana";
// 字符串比较
if (str1 < str2) {
std::cout << str1 << " is less than " << str2 << std::endl;
}
return 0;
}
4. 字符串查找与提取
std::string
提供了强大的查找和提取功能。
find()
:查找子字符串的首次出现位置。substr()
:提取子字符串。rfind()
:从右边查找子字符串的首次出现位置。
示例:
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 查找子字符串
size_t pos = str.find("World");
if (pos != std::string::npos) {
std::cout << "'World' found at position: " << pos << std::endl;
}
// 提取子字符串
std::string substr = str.substr(7, 5); // 从索引 7 开始,长度为 5
std::cout << "Extracted substring: " << substr << std::endl; // World
return 0;
}
5. std::string
的内存管理
std::string
自动管理内存。当字符串内容增加或减少时,std::string
会自动分配和释放内存。你无需手动管理内存,这使得 std::string
在处理变长字符串时非常方便和安全。
- 容量管理:可以通过
size()
获取字符串的长度,capacity()
获取分配的内存大小,resize()
来调整字符串的大小。 - 内存优化:
shrink_to_fit()
可以减少字符串所占用的内存(仅适用于 C++11 及以上)。
示例:
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
std::cout << "Size: " << str.size() << std::endl; // 13
std::cout << "Capacity: " << str.capacity() << std::endl; // 15 or more depending on implementation
// 调整大小
str.resize(5);
std::cout << "Resized string: " << str << std::endl; // Hello
return 0;
}
6. C++11 新增的字符串操作
C++11 引入了一些新的字符串操作:
std::to_string()
:将数值类型转换为字符串。std::stoi()
:将字符串转换为整数。std::stof()
:将字符串转换为浮点数。
示例:
#include <iostream>
#include <string>
int main() {
int num = 123;
std::string str = std::to_string(num);
std::cout << "String from integer: " << str << std::endl; // 123
str = "456";
int converted = std::stoi(str);
std::cout << "Converted string to integer: " << converted << std::endl; // 456
return 0;
}
7. 性能优化与注意事项
- 避免不必要的拷贝:尽量使用引用或移动语义(例如通过
std::move()
)来避免不必要的字符串拷贝。 - 预分配内存:通过
reserve()
可以预先分配足够的内存空间,避免在拼接或扩展字符串时进行重复的内存分配。
8. 结论
std::string
是 C++ 中处理字符串的强大工具。它简化了字符串的创建、操作、比较和内存管理,相较于传统的 C 风格字符串,提供了更多的灵活性和安全性。掌握 std::string
的基本操作,将帮助你更高效地处理字符串数据。
推荐阅读:
发表回复