C++ 中的字符串
在 C++ 中,字符串是 std::string 类的对象,用于表示和操作字符序列。
与 C 风格的字符数组(char[])不同,std::string 会自动管理内存,并提供了大量内置函数,使用起来更加方便。
它可以随着字符的添加或删除自动增长或缩小,不像固定大小的 C 风格字符串。你可以轻松地访问字符、拼接字符串、比较字符串、提取子字符串以及在字符串中查找内容,这些都通过内置函数完成。
示例代码讲解:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
// 创建一个字符串
string str = "Hello Geeks";
// 使用索引遍历字符串
cout << "使用索引遍历: ";
for (int i = 0; i < str.size(); i++) {
cout << str[i];
}
cout << endl;
// 使用范围 for 循环遍历字符串
cout << "使用范围 for 循环遍历: ";
for (char ch : str) {
cout << ch;
}
cout << endl;
// 使用迭代器遍历字符串
cout << "使用迭代器遍历: ";
for (auto it = str.begin(); it != str.end(); it++) {
cout << *it;
}
cout << endl;
return 0;
}
makefile
使用索引遍历: Hello Geeks
使用范围 for 循环遍历: Hello Geeks
使用迭代器遍历: Hello Geeks
语法
字符串容器在 <string> 头文件中被定义为 std::string 类。
cpp
string str;
其中:
string:由 STL 提供的类,用于处理字符序列。str:为该字符串对象指定的名称。
字符串的基本操作
1.初始化字符串
初始化字符串是在创建字符串对象时就给它赋初值。
可以直接用 = 号,或者用构造函数语法,把用引号括起来的文本赋给字符串。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
// 直接初始化字符串
string str = "Hello Geeks";
// 打印字符串
cout << str << endl;
return 0;
}
string str = "abc";是 拷贝初始化(编译器可能优化为直接构造)。
string str("abc");是 直接初始化,显式调用构造函数。
Hello Geeks
2.访问字符
可以用 [] 运算符或 .at() 成员函数访问字符串中的 单个字符。
时间复杂度:O(1)。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello Geeks";
// 用 [] 访问
cout << "第一个字符: " << str[0] << endl;
cout << "第五个字符: " << str[4] << endl;
// 用 .at() 访问
cout << "索引 6 处的字符: " << str.at(6) << endl;
return 0;
}
makefile
第一个字符: H
第五个字符: o
索引 6 处的字符: G
3.字符串长度
可以用 size() 或 length() 获取字符串中的字符个数。
时间复杂度:O(1)。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello Geeks";
// 使用 size()
cout << ""Length using size(): " << str.size() << endl;
// 使用 length()
cout << "Length using length(): " << str.length() << endl;
return 0;
}
csharp
Length using size(): 11
Length using length(): 11
4.字符串拼接
可以用 + 运算符或 append() 函数把两个字符串连接起来。
+运算符会生成一个新的字符串append()则是在原字符串末尾追加,直接修改原字符串
时间复杂度:O(n + m),其中 n 是原字符串长度,m 是待拼接字符串的长度。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "Hello";
string str2 = " Geeks";
// 使用 + 运算符
string result1 = str1 + str2;
cout << "Concatenation using + : " << result1 << endl;
// 使用 append() 函数
string result2 = str1;
result2.append(str2);
cout << "Concatenation using append(): "<< result2 << endl;
return 0;
}
csharp
Concatenation using + : Hello Geeks
Concatenation using append(): Hello Geeks
5.修改字符串
可以用 .push_back() 添加字符,.pop_back() 删除末尾字符,或用 .insert()、.erase() 进行插入与删除。
push_back/pop_back:O(1)insert/erase:O(n)(因可能需要移动后续字符)
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello Geeks";
// 在末尾添加一个字符
str.push_back('!');
cout << "push_back 后: " << str << endl;
// 删除最后一个字符
str.pop_back();
cout << "pop_back 后: " << str << endl;
// 在指定位置插入子串
str.insert(5, " C++"); // 在第 5 个字符前插入
cout << "insert 后: " << str << endl;
// 删除指定区间字符
str.erase(5, 4); // 从索引 5 开始删 4 个字符
cout << "erase 后: " << str << endl;
return 0;
}
lua
push_back 后: Hello Geeks!
pop_back 后: Hello Geeks
insert 后: Hello C++ Geeks
erase 后: Hello Geeks
6.子串提取
使用 .substr(pos, len) 可以从原字符串中提取一段子串:
pos:起始位置(从 0 开始计数)len:要提取的字符个数
该函数会返回一个新的字符串 ,包含从 pos 开始的 len 个字符。
时间复杂度:O(len)
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello Geeks";
// 提取 "Hello"
string sub1 = str.substr(0, 5);
cout << "子串 1: " << sub1 << endl;
// 提取 "Geeks"
string sub2 = str.substr(6, 5);
cout << "子串 2: " << sub2 << endl;
return 0;
}
yaml
子串 1: Hello
子串 2: Geeks
7.在字符串中查找
find() 函数用于在字符串内搜索子串。
- 如果找到,返回子串第一次出现的起始下标(从 0 开始);
- 如果未找到,返回特殊值
string::npos。
时间复杂度:O(n × m),其中 n 是原字符串长度,m 是待查子串长度。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello Geeks";
size_t pos = str.find("Geeks"); // 查找子串 "Geeks"
if (pos != string::npos) { // 也可以写成 pos < str.size()
cout << "\"Geeks\" 在索引处找到: " << pos << endl;
}
return 0;
}
arduino
"Geeks" 在索引处找到: 6
C++ 字符串函数
C++ 提供了一系列内置函数用于字符串处理,例如用于拷贝的 strcpy()、用于拼接的 strcat() 等。下面列出常用函数及其作用:
| 函数 | 说明 |
|---|---|
length() |
返回字符串长度(字符个数)。 |
swap() |
交换两个字符串的值。 |
size() |
返回字符串大小(与 length() 等价)。 |
resize() |
将字符串长度调整为指定值(可截断或填充)。 |
find() |
查找子串首次出现的位置,未找到返回 string::npos。 |
push_back() |
在字符串末尾追加一个字符。 |
pop_back() |
删除字符串最后一个字符。 |
clear() |
清空字符串,使其长度为 0。 |
strncmp() |
比较两个字符串的前 n 个字符(C 风格)。 |
strncpy() |
拷贝源字符串的前 n 个字符到目标字符串(C 风格)。 |
strrchr() |
查找字符在字符串中最后一次出现的位置(C 风格)。 |
strcat() |
将源字符串拼接到目标字符串末尾(C 风格)。 |
replace() |
将字符串中指定区间或子串替换为新内容。 |
substr() |
提取从指定位置开始、指定长度的子串。 |
compare() |
按字典序比较两个字符串,返回整型结果(0 表示相等)。 |
erase() |
删除字符串中指定位置或区间的字符。 |
rfind() |
查找子串最后一次出现的位置。 |