文章目录
C++ string
类详解:从入门到精通
前言
C++ 标准库中的 string
类是操作字符串的强大工具。与传统的 C 风格字符串(char[]
)相比,string
不仅支持自动内存管理,还提供了多种简洁而强大的接口。本文将带你详细了解 string
的常见用法、构造方法、容量操作、访问与修改等操作,帮助你从容应对实际开发中涉及字符串操作的场景。
第一章:C 语言中的字符串 vs C++ string
类
1.1 C 语言中的字符串
在 C 语言中,字符串本质上是以 \0
结尾的字符数组。C 标准库为此提供了 str
系列函数,如 strlen()
、strcpy()
和 strcat()
等。虽然这些函数可以操作字符串,但它们的操作十分繁琐且容易出错,尤其是在内存管理方面。
例如,在 C 语言中进行字符串拼接的代码如下:
#include <stdio.h>
#include <string.h>
int main() {
char str1[50] = "Hello";
char str2[50] = " World";
// 字符串连接
strcat(str1, str2);
printf("%s\n", str1); // 输出:Hello World
return 0;
}
问题:C 语言中的字符串操作容易出现内存溢出,因为需要手动管理字符数组的长度。
1.2 C++ string
类的优势
C++ 中的 string
类使得字符串操作更加安全和简便。它封装了复杂的内存管理,并提供了类似数组的接口,开发者不再需要手动管理字符串的长度和内存。例如,使用 string
进行字符串拼接:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "Hello";
string str2 = " World";
// 使用 += 操作符进行拼接
str1 += str2;
cout << str1 << endl; // 输出:Hello World
return 0;
}
第二章:string
类的构造与基础操作
2.1 string
类的构造方法
string
类支持多种构造方式,以下是常见的构造函数:
2.1.1 示例代码:构造字符串
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1; // 空字符串
string s2("Hello C++"); // 通过C字符串初始化
string s3(s2); // 拷贝构造
string s4(5, 'A'); // 5个'A'字符的字符串
cout << "s1: " << s1 << endl;
cout << "s2: " << s2 << endl;
cout << "s3: " << s3 << endl;
cout << "s4: " << s4 << endl;
return 0;
}
输出示例:
s1:
s2: Hello C++
s3: Hello C++
s4: AAAAA
2.2 string
对象的常见操作
2.2.1 示例代码:字符串容量操作
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Hello";
cout << "Size: " << s.size() << endl; // 返回字符串长度
cout << "Capacity: " << s.capacity() << endl; // 返回容量
s.resize(10, 'X'); // 将长度改为10,多出部分用'X'填充
cout << "Resized: " << s << endl;
s.clear(); // 清空字符串
cout << "Is empty: " << s.empty() << endl; // 检查是否为空
return 0;
}
输出示例:
Size: 5
Capacity: 15
Resized: HelloXXXXX
Is empty: 1
2.3 字符串的遍历与访问
可以通过以下几种方式访问字符串中的字符:
2.3.1 示例代码:遍历与访问字符
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Hello C++";
// 使用下标访问
cout << "First character: " << s[0] << endl;
// 使用迭代器遍历
for (auto it = s.begin(); it != s.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
return 0;
}
输出示例
First character: H
H e l l o C + +
第三章:字符串的高级操作
3.1 字符串的查找操作
string
类提供了多种查找子字符串或字符的方法。常见的查找方法如下:
- 它通常等于(
size_t(-1)
),具体值是实现定义的,但它在所有实现中都用于表示“未找到”的状态。
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "Value of string::npos: " << string::npos << endl;
return 0;
}
输出结果:
Value of string::npos: 18446744073709551615 // 这是 size_t 的最大值 (通常等于 -1)
3.1.1 示例代码:查找子字符串
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Hello World";
// 查找 "World" 在字符串中的位置
size_t pos = s.find("World");
if (pos != string::npos) {
cout << "'World' found at position: " << pos << endl;
} else {
cout << "'World' not found" << endl;
}
// 反向查找 'o'
size_t rpos = s.rfind('o');
cout << "'o' last found at position: " << rpos << endl;
return 0;
}
输出示例:
'World' found at position: 6
'o' last found at position: 7
3.1.2 示例代码:查找任意字符
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Hello, World!";
string charset = "aeiou"; // 查找元音字母
// 使用 find_first_of 查找字符集中任意字符第一次出现的位置
size_t first_pos = s.find_first_of(charset);
if (first_pos != string::npos) {
cout << "First vowel in the string found at position: " << first_pos << endl;
} else {
cout << "No vowel found in the string." << endl;
}
// 使用 find_last_of 查找字符集中任意字符最后一次出现的位置
size_t last_pos = s.find_last_of(charset);
if (last_pos != string::npos) {
cout << "Last vowel in the string found at position: " << last_pos << endl;
} else {
cout << "No vowel found in the string." << endl;
}
return 0;
}
输出示例:
First vowel in the string found at position: 1
Last vowel in the string found at position: 8
3.1.3 相关链接
- C++
string::find()
文档 - C++
string::rfind()
文档 - C++
string::find_first_of()
文档 - C++
string::find_last_of()
文档
3.2 字符串的比较操作
在 C++ 中,string
类支持字符串的比较操作,既可以使用运算符 ==
、!=
、<
、>
等,也可以通过 compare()
方法进行更细粒度的比较。
3.2.1 示例代码:字符串比较
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "Apple";
string str2 = "Banana";
if (str1 == str2) {
cout << "Strings are equal" << endl;
} else {
cout << "Strings are not equal" << endl;
}
// 使用 compare() 方法比较
int result = str1.compare(str2);
if (result == 0) {
cout << "Strings are equal" << endl;
} else if (result < 0) {
cout << "str1 is less than str2" << endl;
} else {
cout << "str1 is greater than str2" << endl;
}
return 0;
}
输出示例:
Strings are not equal
str1 is less than str2
3.2.2 相关链接
3.3 字符串的替换操作
在 C++ 中,string
类允许我们通过 replace()
方法替换字符串中的部分内容。
3.3.1 示例代码:替换字符串中的部分内容
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello World";
// 替换 "World" 为 "C++"
str.replace(6, 5, "C++");
cout << str << endl; // 输出:Hello C++
return 0;
}
输出示例:
Hello C++
3.3.2 相关链接
3.4 字符串的截取操作
string
类提供了 substr()
方法来提取字符串中的子字符串。
3.4.1 示例代码:提取子字符串
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello World";
// 从位置 6 开始截取 5 个字符
string sub = str.substr(6, 5);
cout << "Substring: " << sub << endl;
return 0;
}
输出示例:
Substring: World
3.4.2 相关链接
3.5 字符串的插入与删除操作
在 C++ 中,string
类支持通过 insert()
在字符串的指定位置插入子字符串,或通过 erase()
从指定位置删除字符。
3.5.1 示例代码:插入与删除操作
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Hello World";
// 在索引 5 处插入一个逗号
str.insert(5, ",");
cout << "After insert: " << str << endl;
// 删除索引 5 开始的 1 个字符
str.erase(5, 1);
cout << "After erase: " << str << endl;
return 0;
}
输出示例:
After insert: Hello, World
After erase: Hello World
3.5.2 相关链接
3.6 字符串与数值的转换
C++ 提供了 to_string()
和 stoi()
等函数,帮助我们在字符串和数值之间进行转换。
3.6.1 示例代码:数字与字符串的相互转换
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 42;
string str = to_string(num); // 数字转字符串
cout << "String: " << str << endl;
string strNum = "123";
int parsedNum = stoi(strNum); // 字符串转整数
cout << "Parsed Integer: " << parsedNum << endl;
return 0;
}
输出示例:
String: 42
Parsed Integer: 123
3.6.2 相关链接
写在最后
本文详细解析了 C++ string
类的常见构造方法、容量操作、字符访问、字符串的拼接、查找、比较等操作。希望这些内容能够帮助你更好地理解和使用 string
类。
以上就是关于【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️