目录
string容器
string容器是C++风格的字符串 (使用string字符串更加便捷,安全)
string本质是一个类,它定义在 <string> 头文件中,用于表示和操作字符串
char本质是一个指针
std::vector<char>的功能增强版就是std::string
特点:
- 封装性:std::string它封装了底层的字符数组,提供了面向对象的接口来操作字符串,用户无需直接管理内存,降低了因手动处理指针而导致的错误,如内存泄漏或访问违例。
- 自动内存管理:std::string会自动调整其内存大小以适应字符串内容的变化,包括增长和缩小。这意味着在拼接、插入或删除字符时,不需要担心缓冲区溢出或浪费内存空间。当字符串对象被销毁时,其占用的内存也会被自动释放。
- 兼容C风格字符:通过构造函数、赋值运算符或特定成员函数如c_str()实现。
string的使用流程
- 需要添加头文件<string>
- 定义及初始化string容器
- 使用string容器
需要添加头文件
#include<string>
string定义字符串
格式:std::string 字符串名;
string还可以定义字符串数组
格式:std::string 字符串数组名(数组大小);
string类的初始化
可以用=或者{}进行赋值,可以进行相同连续的赋值
#include <iostream>
#include <string>
int main()
{
std::string str1; // 创建一个空字符串
std::string str2 = "Hello"; // 使用字符串字面量初始化
std::string str3(str2); // 使用另一个字符串对象初始化
std::string str4(5, 'c'); // 创建包含5个字符'c'的字符串
return 0;
}
相对于C风格的字符串运算string的运算更加简便和安全
string类的常用操作
连接
使用 + 运算符或 append() 方法连接字符串。
std::string str1 = "Hello";
std::string str2 = "C++";
std::string str3 = str1 + " " + str2; // "Hello C++"
str1.append(" C++"); // str1 现在也是 "Hello C++"
比较
直接使用比较运算符比较字符串。
if (str1 == str2)
{
// 字符串相等
} else if (str1 < str2)
{
// str1 小于 str2
}
访问字符
使用下标运算符或 at() 方法访问特定位置的字符。
char ch = str1[0]; // 获取第一个字符
char ch2 = str1.at(0);
// 同样获取第一个字符,但会进行范围检查
//at不会使用溢出
子字符串查找
使用 find() 方法查找子字符串的位置。
size_t pos = str1.find("World");
// 返回子字符串在 str1 中的位置,如果没找到则返回 std::string::npos
修改字符串
使用 replace() 方法替换子字符串,或使用赋值运算符修改特定位置的字符。
str1.replace(pos, 5, "C++"); // 从 pos 开始,替换 5 个字符为 "C++"
str1[0] = 'h'; // 修改第一个字符为 'h'
大小
使用 size() 或 length() 方法获取字符串的长度。
size_t len = str1.size(); // 获取字符串长度
size_t len = str.length(); // 获取字符串的长度
插入和删除
使用 insert() 方法在字符串中插入字符或子字符串,使用 erase() 方法删除字符或子字符串。
str1.insert(0, "Hi "); // 在字符串开头插入 "Hi "
str1.erase(0, 2); // 删除前两个字符
兼容C风格字符串
使用c_str或者赋值的操作
#include<iostream>
#include<string>
int main()
{
std::string a{ "abssdf" };
const char* c = a.c_str();
std::cout << c;
return 0;
}
//输出结果是
//abssdf
其他功能
std::string 还提供了其他方法,如 substr()(获取子字符串)、swap()(交换两个字符串的内容)等。