std::string是C++标准库中的一个基本类模板,专门用于处理字符串。它提供了一个可变长度的字符序列,以及一系列用于字符串操作的方法。std::string是值类型,这意味着当它作为函数参数传递或赋值时,整个字符串数据会被复制。
std::string的特性:
- 可变长度:std::string可以动态地调整大小以存储不同长度的字符串
- 随机访问:std::string可以通过索引随机访问字符
- 自动内存管理:无需手动管理内存,std::string会自动分配和释放内存
- 模板类:std::string是一个模板类,但通常用于char类型的字符串
std::string对象通常包含了一个指向堆上分配的内存的指针,用于存储较长的字符串。较短的字符串可能会直接存在对象本身的内部缓冲区,有些实现还会使用一个独立的缓冲区来存储字符串内容。
std::string提供了一系列成员函数来操作对象:
构造函数
std::string():默认构造一个空字符串
std::string(const char* str):从C风格字符串构造
std::string(const std::string& str):拷贝构造函数,深拷贝
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 std::cout << str << std::endl; // abc12345 std::string new_str1(str); // 拷贝构造,深拷贝 std::cout << str << std::endl; // abc12345 std::cout << new_str1 << std::endl; // abc12345 std::string new_str2(std::move(str)); // 移动构造 std::cout << str.size() << std::endl; // 0 std::cout << new_str2 << std::endl; // abc12345
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 const char* cstr = str.c_str(); // c_str()返回指向字符串第一个字符的指针 std::cout << *cstr << std::endl; // a std::cout << cstr << std::endl; // abc12345 c_str()返回的指针指向的是一个只读的C风格字符串,这意味着不能通过这个指针来修改std::string对象中字符串的内容。
赋值操作
赋值运行符 =:将一个字符串的内容复制给另一个字符串
swap(std::string& other):交换两个字符串的内容
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 std::string new_str = str; // 赋值操作,深拷贝 std::cout << str << std::endl; // abc12345 std::cout << new_str << std::endl; // abc12345 std::string swap_str = "678"; str.swap(swap_str); // 交换两个字符串 std::cout << str << std::endl; // 678 std::cout << swap_str << std::endl; // abc12345
连接字符串
operator +:连接两个字符串
operator +=:将另一个字符串连接到当前字符串
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 std::string new_str = "678"; std::string conn_str = str + new_str; // 连接字符串 std::cout << conn_str << std::endl; // abc12345678
访问字符
operator[]:通过索引访问字符串中的字符
at(size_type n):通过索引访问字符串中的字符,带边界检查
front():返回字符串中的第一个字符
back():返回字符串中的最后一个字符
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 std::cout << str[1] << std::endl; // 访问索引为1的字符,b std::cout << str.at(7) << std::endl; // 访问索引为7的字符,5 std::cout << str.front() << std::endl; // 返回第一个字符,a std::cout << str.back() << std::endl; // 返回最后一个字符,5
查找和替换
find():在字符串中查找子字符串或字符
replace():替换字符串中的部分内容
std::string str = "abc12345cba"; // 创建一个字符串,并进行初始化 std::cout << str.find("b") << std::endl; // 查找字符串中从左到右的第一个字符b,并返回其索引,1 std::cout << str.rfind("b") << std::endl; // 查找字符串中从右到左的第一个字符b,并返回其索引,9 std::cout << str.find("abc") << std::endl; // 查找字符串中的子字符串,返回其开头索引,0 std::cout << str.find("abcd") << std::endl; // 若查找不到子字符串或字符,则返回一个随机数,18446744073709551615 str.replace(3, 5, "321"); // 从索引为3的字符开始,将5个字符换成321 std::cout << str << std::endl; // abc321cba
修改字符串
push_back(char ch):在字符串末尾添加一个字符
pop_back():移除字符串末尾的字符
append(std::string& other):在字符串末尾添加一个字符串
erase():删除字符串中的指定位置或指定范围的字符
assign(std::string& other):用新的字符串替换原有内容
insert():在指定位置插入字符或字符串
resize():修改字符串的大小
clear():清空字符串
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 str.push_back('A'); // 字符串末尾添加一个字符 std::cout << str << std::endl; // abc12345A str.pop_back(); // 移除字符串末尾的字符 std::cout << str << std::endl; // abc12345 str.append("678A"); // 字符串末尾添加字符串 std::cout << str << std::endl; // abc12345678A str.erase(5); // 删除字符串中索引为5及以后的字符 std::cout << str << std::endl; // abc12 str.erase(1, 3); // 删除字符串中索引从1开始的3个字符 std::cout << str << std::endl; // a2 str.assign("678"); // 用新的字符串替换掉原来的字符串 std::cout << str << std::endl; // 678 str.clear(); // 清空字符串 std::cout << str.size() << std::endl; // 0
子字符串
substr():提取子字符串
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 std::string sub_str = str.substr(2, 4); // 提取从索引2开始共4个字符的子字符串 std::cout << sub_str << std::endl; // c123
容量
length():返回字符串的长度
size():返回字符串中的字符数量,也就是字符串长度
capacity():返回字符串的容量
reserve():更改容量
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 std::cout << str.length() << std::endl; // 8 std::cout << str.size() << std::endl; // 8 std::cout << str.capacity() << std::endl; // 15 str.push_back('6'); std::cout << str.capacity() << std::endl; // 15 str.reserve(20); // 更改容量,容量会变得更大,但不一定是给出的值,因为容量的变化是按照指数或线性规律来的 std::cout << str.capacity() << std::endl; // 31 长度表示字符串当前实际包含的字符数,而容量表示分配给字符数组的内存空间大小。当字符串的长度超过容量时,std::string会重新分配更大的内存空间,并将原有的字符复制到新的内存位置。 当std::string对象的生命周期结束时,它会自动释放所分配的内存,不需要手动调用delete或free()释放字符串的内存,因为std::string类会在对象销毁时自动调用相应的析构函数来释放内存。 与C语言中的字符串类似,std::string的底层实现也会在字符数组的末尾添加一个空终止字符(‘\0’),以表示字符串的结束。这样可以使得std::string类的接口与标准C字符串函数兼容,但是std::string的size()和length()不会统计('\0')。
迭代器
begin():返回指向第一个字符的迭代器
end():返回指向尾后一位的迭代器
std::string str = "abc12345"; // 创建一个字符串,并进行初始化 for (auto it = str.begin(); it != str.end(); ++it) { std::cout << *it << std::endl; // a b c 1 2 3 4 5 } for (auto value : str) { std::cout << value << std::endl; // a b c 1 2 3 4 5 }
其他成员函数
- data():返回指向字符串第一个字符的指针
- c_str():返回指向字符串第一个字符的指针
- empty():检查字符串是否为空