目录
一、介绍
二、常用接口
1.构造函数和赋值操作
2.string类对象的容量操作
3.string类对象的访问及遍历操作
4.string类对象的修改操作
5.string类非成员函数
放在最后
一、介绍
在C++中,std::string
是标准库提供的字符串类。它属于 <string>
头文件,并为处理字符串提供了一套丰富的功能和方法。std::string
是一个动态数组类,它能够自动调整大小,提供了许多便利的成员函数用于字符串的操作和处理。下面是string类的常用操作:
-
动态大小:
std::string
类能够自动调整大小,不需要手动管理内存,这使得字符串的使用更为方便。 -
成员函数:
std::string
提供了丰富的成员函数,包括字符串的连接、截取、查找、替换、比较等操作。 -
访问字符: 通过索引、迭代器等方式可以访问和修改字符串中的字符。
-
输入输出: 可以使用流操作符
<<
和>>
进行字符串的输入和输出。 -
构造函数:
std::string
支持多种构造函数,包括默认构造函数、接受 C 风格字符串的构造函数、拷贝构造函数等。 -
常用算法: 提供了一些常用的算法,比如字符串查找、替换等。
-
内存管理:
std::string
负责管理字符串的内存,避免了手动内存管理的麻烦。
二、常用接口
1.构造函数和赋值操作
- 默认构造函数:
std::string()
- 带字符串参数的构造函数:
std::string(const char* s)
- 拷贝构造函数:
std::string(const std::string& str)
- 赋值操作符:
operator=
,assign
代码实例:
#include <iostream>
#include <string>
using namespace std;int main() {// 默认构造函数std::string str1;// 带字符串参数的构造函数std::string str2 = "Hello, World!";// 拷贝构造函数std::string str3 = str2;// 赋值操作std::string str4;str4 = "World, Hello!";std::cout << str1 << std::endl;std::cout << str2 << std::endl;std::cout << str3 << std::endl;std::cout << str4 << std::endl;return 0;
}
输出:
2.string类对象的容量操作
length
方法: 返回字符串的长度size
方法: 返回字符串的大小(长度)- capacity 方法:返回空间总大小
- empty 方法:检测字符串释放为空串,是返回true,否则返回false
- clear 方法:清空有效字符
- reverse 方法:为字符串预留空间
- resive 方法:将有效字符的个数该成n个,多出的空间用字符c填充
代码实例:
#include <iostream>
#include <string>int main() {std::string myString = "Hello, World!";// length 方法:返回字符串的长度std::cout << "Length: " << myString.length() << std::endl;// size 方法:返回字符串的大小(长度)std::cout << "Size: " << myString.size() << std::endl;// capacity 方法:返回空间总大小std::cout << "Capacity: " << myString.capacity() << std::endl;// empty 方法:检测字符串是否为空串std::cout << "Is empty? " << (myString.empty() ? "Yes" : "No") << std::endl;// clear 方法:清空有效字符myString.clear();std::cout << "After clear: " << myString << std::endl;// reverse 方法:为字符串预留空间myString.reserve(20);std::cout << "After reserving space: " << myString << std::endl;// resize 方法:将有效字符的个数修改为 n 个,多出的空间用字符 'X' 填充myString.resize(10, 'X');std::cout << "After resizing: " << myString << std::endl;return 0;
}
输出:
3.string类对象的访问及遍历操作
- operator[] : 返回pos位置的字符,const string类对象调用
- begin + end: begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
- rbegin + rend:rbegin获取最后一个字符的迭代器 + end获取第一个字符前一个位置的迭代器
- 范围 for:C++11支持更简洁的范围for的新遍历方式
代码实例:
#include <iostream>
#include <string>int main() {const std::string myString = "Hello, World!";// operator[]:返回 pos 位置的字符,const string 类对象调用char character = myString[7];std::cout << "Character at position 7: " << character << std::endl;// begin + end:begin 获取第一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器std::cout << "Using begin() and end() to iterate:" << std::endl;for (auto it = myString.begin(); it != myString.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// rbegin + rend:rbegin 获取最后一个字符的迭代器 + end 获取第一个字符前一个位置的迭代器std::cout << "Using rbegin() and rend() to iterate in reverse:" << std::endl;for (auto it = myString.rbegin(); it != myString.rend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 范围 for 循环:C++11 支持更简洁的范围 for 的新遍历方式std::cout << "Using range-based for loop:" << std::endl;for (char c : myString) {std::cout << c << " ";}std::cout << std::endl;return 0;
}
输出:
4.string类对象的修改操作
- push back:在字符串后尾插字符c
- append:在字符串后追加一个字符串
- operator +=:在字符串后追加字符串str
- c_str:返回C格式字符串
- find + npos:从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
- rfind:从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
- substr:在str中从pos位置开始,截取n个字符,然后将其返回
代码实例:
#include <iostream>
#include <string>int main() {std::string myString = "Hello, ";// push_back:在字符串后尾插字符 'C'myString.push_back('C');std::cout << "After push_back: " << myString << std::endl;// append:在字符串后追加一个字符串myString.append("World!");std::cout << "After append: " << myString << std::endl;// operator +=:在字符串后追加字符串 " Welcome!"myString += " Welcome!";std::cout << "After operator +=: " << myString << std::endl;// c_str:返回 C 格式字符串const char* cStr = myString.c_str();std::cout << "C-style string: " << cStr << std::endl;// find + npos:从字符串位置 7 开始往后找字符 'o',返回该字符在字符串中的位置size_t pos = myString.find('o', 7);if (pos != std::string::npos) {std::cout << "Found 'o' at position: " << pos << std::endl;} else {std::cout << "'o' not found." << std::endl;}// rfind:从字符串位置 7 开始往前找字符 'o',返回该字符在字符串中的位置size_t rpos = myString.rfind('o', 7);if (rpos != std::string::npos) {std::cout << "Found last 'o' at position: " << rpos << std::endl;} else {std::cout << "Last 'o' not found." << std::endl;}// substr:在字符串中从位置 7 开始截取 5 个字符,然后将其返回std::string substr = myString.substr(7, 5);std::cout << "Substring: " << substr << std::endl;return 0;
}
输出:
5.string类非成员函数
- operator+:传值返回,导致深拷贝效率低(少用)
- operator>>:输入运算符重载
- operator<<:输出运算符重载
- getline:获取一行字符串
- relational operators:大小比较
代码实例:
#include <iostream>
#include <string>int main() {// operator+:传值返回,导致深拷贝效率低(少用)std::string str1 = "Hello, ";std::string str2 = "World!";std::string result = str1 + str2; // 使用 operator+ 进行字符串连接std::cout << "Concatenated string: " << result << std::endl;// operator>>:输入运算符重载std::string inputString;std::cout << "Enter a string: ";std::cin >> inputString;std::cout << "You entered: " << inputString << std::endl;// operator<<:输出运算符重载std::string outputString = "Output this string!";std::cout << "Output using operator<<: " << outputString << std::endl;// getline:获取一行字符串std::string line;std::cout << "Enter a line of text: ";std::getline(std::cin, line);std::cout << "You entered: " << line << std::endl;// relational operators:大小比较std::string str3 = "apple";std::string str4 = "banana";if (str3 == str4) {std::cout << "Strings are equal." << std::endl;} else if (str3 < str4) {std::cout << "str3 is less than str4." << std::endl;} else {std::cout << "str3 is greater than str4." << std::endl;}return 0;
}
输出:
放在最后
以上只是对string类的初步认识,想要继续深入了解它还需要经过大量的练习以及string类的自我实现,理解了它的底层原理才能更好地运用它,后续我也会继续推出有关string类的自我实现的博客,请期待一波~~