在 C++ 中,std::string
是一个非常常用的类,它提供了许多方便的接口来操作字符串。std::string
是 C++ 标准库中 std::basic_string
模板的一个实例化,专门用于处理字符串。这里我们将介绍一些常用的 std::string
接口。
1. 构造函数
-
默认构造函数:
std::string str; // 创建一个空字符串
-
从 C 风格字符串构造:
const char* cstr = "Hello, World!"; std::string str(cstr); // 使用C风格字符串初始化
-
从字符初始化:
std::string str(5, 'a'); // 创建一个包含5个字符'a'的字符串
-
从子字符串初始化:
std::string str("Hello, World!", 5); // 创建一个包含前5个字符的字符串 "Hello"
2. 赋值操作
-
赋值操作符:
std::string str = "Hello"; std::string str2; str2 = str; // 通过赋值操作符复制内容
-
从 C 风格字符串赋值:
std::string str; str = "Hello, World!"; // 赋值C风格字符串
-
赋值指定长度的子字符串:
std::string str; str.assign("Hello, World!", 5); // 将字符串 "Hello" 赋值给str
3. 常用成员函数
3.1. 访问和修改字符串内容
-
获取字符:
char ch = str[0]; // 获取字符串的第一个字符 char ch2 = str.at(1); // 使用 at() 安全访问第2个字符
-
修改字符:
str[0] = 'h'; // 修改第一个字符为小写 'h' str.at(1) = 'E'; // 修改第二个字符为 'E'
-
追加内容:
str += " there"; // 追加字符串 str.append("!"); // 使用 append() 追加
-
插入内容:
str.insert(5, ", World"); // 在索引位置5插入 ", World"
-
删除内容:
str.erase(5, 7); // 从索引5开始删除7个字符
3.2. 字符串大小和清空
-
获取长度:
size_t len = str.size(); // 获取字符串的长度
-
检查是否为空:
bool isEmpty = str.empty(); // 检查字符串是否为空
-
清空字符串:
str.clear(); // 清空字符串内容
3.3. 子字符串
-
获取子字符串:
std::string substr = str.substr(0, 5); // 获取从索引0开始的5个字符子字符串
-
查找子字符串:
size_t pos = str.find("World"); // 查找 "World" 在字符串中的位置,返回找到的索引,未找到返回 std::string::npos if (pos != std::string::npos) { std::cout << "Found at position: " << pos << std::endl; }
-
查找字符:
size_t pos = str.find('o'); // 查找字符 'o' 的位置
-
替换子字符串:
str.replace(0, 5, "Hi"); // 从索引0开始,替换5个字符为"Hi"
3.4. 字符串比较
-
直接比较:
if (str == "Hello") { // 比较两个字符串是否相等 std::cout << "Strings are equal!" << std::endl; }
-
使用compare函数:
int result = str.compare("Hello"); // 如果str < "Hello" 返回负值,str > "Hello" 返回正值,str == "Hello" 返回0
3.5. 转换
-
转换为 C 风格字符串:
const char* cstr = str.c_str(); // 返回 C 风格字符串(const char*)
-
转换为字符数组:
char arr[100]; str.copy(arr, str.size()); // 将字符串内容拷贝到字符数组中 arr[str.size()] = '\0'; // 添加 null 终止符
3.6. 其他常用函数
-
替换所有出现的某个字符:
std::replace(str.begin(), str.end(), 'o', 'O'); // 将字符串中的 'o' 替换为 'O'
-
分割字符串:
std::vector<std::string> split(const std::string& str, char delimiter) { std::vector<std::string> result; std::stringstream ss(str); std::string token; while (std::getline(ss, token, delimiter)) { result.push_back(token); } return result; } std::vector<std::string> parts = split("Hello,World,123", ',');
4. 常见的操作符重载
- 赋值操作符
=
:可以将一个字符串的内容赋值给另一个字符串。 - 比较操作符:
==
、!=
、<
、>
、<=
、>=
等用于比较字符串的大小。
- 索引操作符
[]
:访问和修改字符串中的单个字符。 - 加号操作符
+
:连接两个字符串。std::string str1 = "Hello"; std::string str2 = " World!"; std::string str3 = str1 + str2; // 连接两个字符串
5. 性能考虑
std::string
使用动态内存分配,它会根据需要调整内存容量,因此对于小型字符串操作,std::string
通常非常高效。- 避免不必要的拷贝:通过使用常量引用
const std::string&
可以避免不必要的拷贝操作。
void printMessage(const std::string& msg) {
std::cout << msg << std::endl;
}
- 避免频繁的拼接操作:在处理大量字符串拼接时,考虑使用
std::ostringstream
或std::string::reserve
来预分配内存,避免多次重新分配。
总结
std::string
提供了丰富的接口来处理字符串,包括初始化、修改、查找、比较等功能。了解并熟练掌握这些接口,可以大大提高你的 C++ 编程效率。