C++字符串处理指南:从基础操作到性能优化——基于std::string的全面解析
博主将从C++标准库中的
std::string
出发,详细探讨字符串的处理方法,涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string
的使用展开,结合代码示例进行说明。
一、std::string
的基本操作
1.1 创建与初始化
std::string
提供了多种构造函数,支持从C风格字符串、字符数组、字符列表等初始化。
示例:
#include <iostream>
#include <string>
int main() {
// 默认构造函数
std::string s1;
// 从C风格字符串初始化
std::string s2 = "Hello, World!";
// 从字符数组初始化
char arr[] = {'H', 'i', '\0'};
std::string s3(arr);
// 重复字符初始化
std::string s4(5, 'A'); // "AAAAA"
std::cout << "s2: " << s2 << std::endl;
std::cout << "s4: " << s4 << std::endl;
return 0;
}
输出:
s2: Hello, World!
s4: AAAAA
1.2 字符串的访问与修改
std::string
提供了多种访问和修改字符串内容的方法。
示例:
#include <iostream>
#include <string>
int main() {
std::string s = "Hello";
// 访问字符
char c = s[0]; // 'H'
char c2 = s.at(1); // 'e'
// 修改字符
s[0] = 'h'; // "hello"
s.at(1) = 'E'; // "hEllo"
// 添加字符
s += ", World!"; // "hEllo, World!"
// 插入字符
s.insert(5, " C++"); // "hEllo C++, World!"
// 删除字符
s.erase(5, 4); // "hEllo, World!"
std::cout << s << std::endl;
return 0;
}
输出:
hEllo, World!
1.3 字符串的比较
std::string
支持通过 ==
、!=
、<
、>
等运算符进行比较。
示例:
#include <iostream>
#include <string>
int main() {
std::string s1 = "apple";
std::string s2 = "banana";
if (s1 == s2) {
std::cout << "s1 and s2 are equal" << std::endl;
} else if (s1 < s2) {
std::cout << "s1 is less than s2" << std::endl;
} else {
std::cout << "s1 is greater than s2" << std::endl;
}
return 0;
}
输出:
s1 is less than s2
二、字符串的查找与替换
2.1 查找子字符串
std::string
提供了 find()
和 rfind()
方法,分别用于查找子字符串的首次和最后一次出现位置。
示例:
#include <iostream>
#include <string>
int main() {
std::string s = "Hello, World! Hello, C++!";
// 查找子字符串
size_t pos = s.find("Hello");
if (pos != std::string::npos) {
std::cout << "Found 'Hello' at position: " << pos << std::endl;
}
// 从后向前查找
size_t rpos = s.rfind("Hello");
if (rpos != std::string::npos) {
std::cout << "Last 'Hello' found at position: " << rpos << std::endl;
}
return 0;
}
输出:
Found 'Hello' at position: 0
Last 'Hello' found at position: 14
2.2 替换子字符串
std::string
提供了 replace()
方法,用于替换指定位置的子字符串。
示例:
#include <iostream>
#include <string>
int main() {
std::string s = "Hello, World!";
// 替换子字符串
s.replace(7, 5, "C++"); // "Hello, C++!"
std::cout << s << std::endl;
return 0;
}
输出:
Hello, C++!
三、字符串的分割与连接
3.1 分割字符串
C++标准库没有直接提供字符串分割函数,但可以通过 find()
和 substr()
实现。
示例:
#include <iostream>
#include <string>
#include <vector>
std::vector<std::string> split(const std::string& s, char delimiter) {
std::vector<std::string> tokens;
size_t start = 0;
size_t end = s.find(delimiter);
while (end != std::string::npos) {
tokens.push_back(s.substr(start, end - start));
start = end + 1;
end = s.find(delimiter, start);
}
tokens.push_back(s.substr(start));
return tokens;
}
int main() {
std::string s = "apple,banana,orange";
std::vector<std::string> fruits = split(s, ',');
for (const auto& fruit : fruits) {
std::cout << fruit << std::endl;
}
return 0;
}
输出:
apple
banana
orange
3.2 连接字符串
std::string
支持通过 +
或 append()
方法连接字符串。
示例:
#include <iostream>
#include <string>
int main() {
std::string s1 = "Hello";
std::string s2 = "World";
// 使用 + 连接
std::string s3 = s1 + ", " + s2 + "!";
// 使用 append() 连接
s1.append(", ").append(s2).append("!");
std::cout << s3 << std::endl;
std::cout << s1 << std::endl;
return 0;
}
输出:
Hello, World!
Hello, World!
四、字符串的性能优化
4.1 预分配内存
通过 reserve()
方法预分配内存,减少频繁扩容的开销。
示例:
#include <iostream>
#include <string>
int main() {
std::string s;
s.reserve(100); // 预分配100字节内存
for (int i = 0; i < 100; ++i) {
s += 'a';
}
std::cout << "Length: " << s.length() << std::endl;
std::cout << "Capacity: " << s.capacity() << std::endl;
return 0;
}
输出:
Length: 100
Capacity: 100
4.2 使用 std::string_view
(C++17)
std::string_view
提供零拷贝的字符串访问,适合只读操作。
示例:
#include <iostream>
#include <string>
#include <string_view>
void print(std::string_view sv) {
std::cout << sv << std::endl;
}
int main() {
std::string s = "Hello, World!";
print(s); // 无需拷贝
print("Literal"); // 直接处理字面量
return 0;
}
输出:
Hello, World!
Literal
五、实际应用场景
5.1 配置文件解析
使用字符串分割和查找功能解析配置文件。
示例:
# config.ini
name=John
age=30
#include <iostream>
#include <string>
#include <fstream>
#include <unordered_map>
std::unordered_map<std::string, std::string> parse_config(const std::string& filename) {
std::unordered_map<std::string, std::string> config;
std::ifstream file(filename);
std::string line;
while (std::getline(file, line)) {
size_t pos = line.find('=');
if (pos != std::string::npos) {
std::string key = line.substr(0, pos);
std::string value = line.substr(pos + 1);
config[key] = value;
}
}
return config;
}
int main() {
auto config = parse_config("config.ini");
std::cout << "Name: " << config["name"] << std::endl;
std::cout << "Age: " << config["age"] << std::endl;
return 0;
}
输出:
Name: John
Age: 30
六、总结
std::string
是C++中处理字符串的核心工具,提供了丰富的操作方法。通过合理使用这些方法,可以高效地完成字符串的创建、修改、查找、分割和连接等任务。在实际开发中,结合性能优化技巧(如预分配内存、使用 std::string_view
),可以进一步提升程序的效率。