C++ string类详解

⭐️ string

string 是表示字符串的字符串类,该类的接口与常规容器的接口基本一致,还有一些额外的操作 string 的常规操作,在使用 string 类时,需要使用 #include <string> 以及 using namespace std;

帮助文档: https://cplusplus.com/reference/string/string/string/

🌟 std::string::string 构造函数(constructor)

序号 构造函数 功能
1️⃣ string() 默认拷贝:构造空的string类对象,即空字符串,默认第一个字符位置是'\0',为了兼容c
2️⃣ string(const string& str) 拷贝构造
3️⃣ string(const string& str , size_t pos , size_t len = npos) 拷贝构造的重载,从字符串 pos 位置开始拷贝,拷贝 len 个字符
4️⃣ string(const char * s) 使用 c_string 来初始化 string 类对象
5️⃣ string(const char * s , size_t n) s 指向的字符串中复制前 n 个字符
6️⃣ string(size_t n , char c) 使用 nc 字符来填充字符串
7️⃣ template <class InputIterator> string (InputIterator first , InputIterator last) 复制一个迭代器序列的字符串 [first , last)
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s1;	// 默认构造 第一个字符是 `\0`
	cout << s1 << endl;

	/*
		调用构造本身的写法应该是:string s2("hello world");
		但是为什么可以这样写呢? string s2 = "hello world";
		因为当构造函数是单参的时候,是支持隐式类型转换的。这里本质上先构造再拷贝构造,但是编译器
		通常会优化为直接构造。若不希望隐式类型的转换可以在构造函数前添加 explicit 关键字
	*/
	string s2 = "hello world"; // 使用c字符串构造一个string类对象
	cout << s2 << endl;

	string s3(s2);	// 拷贝构造
	cout << s3 << endl;

	string s4(s3, 6, 5);  // 拷贝构造的重载 从下标6位置开始拷贝 拷贝5个字符
	cout << s4 << endl;

	string s5("hello" , 3); // 拷贝 `hello` 前3个字符
	cout << s5 << endl;

	string s6(10 , 'a'); // 使用 10个 `a` 填充对象
	cout << s6 << endl;

	string s7(s6.begin() , s6.end()); // 迭代器序列初始化
	cout << s7 << endl;


	return 0;
}

output:


ps: npos 原型:static const size_t npos = -1;npos 的访问:string::npos。无符号的 -1 相当于是整型的最大值,若当不传这个参数时, 或者 len 大于后面剩余字符的长度,那么使用默认参数 npos都是相当于 直到字符串的结束 。[[ 返回 ]](#[ 返回 ])


🌟 std::string::operator= 赋值重载

序号 函数名称 功能
1️⃣ string& operator= (const string& str) 用一个新的 string 对象替换当前 string 对象的内容
2️⃣ string& operator= (const char * s) 用一个c的字符串替换当前 string 对象内容
3️⃣ string& operator= (char c) 使用一个字符替换当前 string 对象的内容
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s1 = "hello world";
// 1.
	string temp = "ccc";
	s1 = temp;
	cout << s1 << endl;
// 2.
	s1 = "hhhh";
	cout << s1 << endl;
// 3.
	s1 = 'a';
	cout << s1 << endl;

	return 0;
}

output:


🌟 元素的访问

序号 函数名称 功能
1️⃣ char& operator[] (size_t pos) 返回当前 string 对象中 pos 位置字符的引用
2️⃣ const char& operator[](size_t pos) const 返回当前 const string 对象中 pos 位置字符的引用
3️⃣ char& at (size_t pos) 返回当前 string 对象中 pos 位置字符的引用
4️⃣ const char& at (size_t pos) const 返回当前 const string 对象中 pos 位置字符的引用
5️⃣ char& back() 返回当前 string 对象最后一个字符的引用
6️⃣ const char& back() const 返回当前 const string 对象最后一个字符的引用
7️⃣ char& front() 返回当前 string 对象第一个字符的引用
8️⃣ const char& front() const 返回当前 const string 对象第一个字符的引用

ps: at[] 的行为是一样的,函数都会检查 pos 是否是合法位置,若不是,[] 是断言错误,而 at 是抛异常。

ps: back == [xx.size() - 1]front == [0]

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	const string s1 = "hello";
	for (size_t i = 0; i < s1.size(); i++) {
		cout << s1[i] << " ";
	}

	cout << endl;

	string s2 = "world";
	for (size_t i = 0; i < s2.size(); i++) {
		s2[i]++;
		cout << s2[i] << " ";
	}

	cout << endl;

	string s3 = "hello world";
	cout << s3.back() << s3[s3.size() - 1] << endl;
	cout << s3.front() << s3[0] << endl;
	cout << s3.at(4) << endl;

	return 0;
}

output:


🌟 元素的长度

序号 函数名称 功能
1️⃣ size_t size() const 返回 string 对象实际字符的长度
2️⃣ size_t length() const 返回 string 对象实际字符的长度
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s = "hello world";
	cout << s.size() << endl;	// 11
	cout << s.length() << endl;	// 11

	return 0;
}

🌟 string 迭代器

序号 函数名称 功能
1️⃣ iterator begin() 返回一个迭代器,该迭代器指向 string 对象的第一个字符
2️⃣ const_iterator begin() const 返回一个迭代器,该迭代器指向 const string 对象的第一个字符
3️⃣ iterator end() 返回一个迭代器,该迭代器指向 string 对象最后一个实际字符的下一个位置
4️⃣ const_iterator end() const 返回一个迭代器,该迭代器指向 const string 对象最后一个实际字符的下一个位置
5️⃣ reverse_iterator rbegin() 返回一个反向迭代器,该迭代器指向 string 对象最后一个实际字符的位置
6️⃣ const_reverse_iterator rbegin() const 返回一个反向迭代器,该迭代器指向 const string 对象最后一个实际字符的位置
7️⃣ reverse_iterator() rend() 返回一个反向迭代器,该迭代器指向 string 对象第一个字符的前一个位置
8️⃣ const_reverse_iterator() rend() const 返回一个反向迭代器,该迭代器指向 const string 对象第一个字符的前一个位置

ps: [ begin() , end() )( rend() , rbegin() ]

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s = "hello world";
	for (string::iterator it = s.begin(); it != s.end(); it++) {
		cout << *it << " ";
	}
	// output: h e l l o   w o r l d
	cout << endl;

	// 自动迭代 自动判断结束
	// 范围for 本质上调用的也是迭代器
	for (auto val : s) {
		cout << val << " ";
	}
	// output: h e l l o   w o r l d
	cout << endl;

	for (string::reverse_iterator it = s.rbegin(); it != s.rend(); it++) {
		cout << *it << " ";
	}
	// output: d l r o w   o l l e h
	cout << endl;

	// const 
	const string s2 = "nihao";
	string::const_iterator it = s2.begin();
	while (it != s2.end()) {
		cout << *it << " ";
		it++;
	}
	// output: n i h a o

	cout << endl;
	string::const_reverse_iterator rit = s2.rbegin();
	while (rit != s2.rend()) {
		cout << *rit << " ";
		rit++;
	}
	// output: o a h i n

	return 0;
}

output:


🌟 string 对象修改

序号 函数名称 功能
1️⃣ void push_back (char c) 在当前 string 对象的末尾追加一个 c 字符
2️⃣ string& append (const string& str) 在当前 string 对象的末尾追加一个 const string str 对象
3️⃣ string& append (const string& str , size_t subpos , size_t sublen) 在当前 string 对象的末尾追加一个 const string str 对象的子串,从 subpos 位置开始,拷贝 sublen 个字符过去 [类似上面构造函数的 npos 用法](#序号 函数名称 功能 1️⃣ void push_back (char c) 在当前 string 对象的末尾追加一个 c 字符 2️⃣ string& append (const string& str) 在当前 string 对象的末尾追加一个 const string str 对象 3️⃣ string& append (const string& str , size_t subpos , size_t sublen) 在当前 string 对象的末尾追加一个 const string str 对象的子串,从 subpos 位置开始,拷贝 sublen 个字符过去 类似上面构造函数的 npos 用法 4️⃣ string& append (const char* s); 在当前 string 对象的末尾追加一个 c_string 字符串 5️⃣ template <class InputIterator> string& append (InputIterator first , InputIterator last) 追加一个迭代器序列的字符串 [first , last))
4️⃣ string& append (const char* s); 在当前 string 对象的末尾追加一个 c_string 字符串
5️⃣ template <class InputIterator> string& append (InputIterator first , InputIterator last) 追加一个迭代器序列的字符串 [first , last)
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s = "hello";
	s.push_back('-');
	cout << s << endl;

	s = "hello";
	string temp = " world";
	s.append(temp);
	cout << s << endl;

	string s2 = "hello";
	string temp2 = " world";
	s2.append(temp2 , 0 , 3);
	cout << s2 << endl;

	string s3 = "hello";
	s3.append(" world");
	cout << s3 << endl;

	string s4 = "hello";
	s4.append(s4.begin(), s4.end());
	cout << s4 << endl;

	string s5 = "hello";
	s5.append(s5.rbegin() , s5.rend());
	cout << s5 << endl;

	return 0;
}

output:


std::string::operator+= 运算符重载

序号 函数名称 功能
6️⃣ string& operator+= (const string& str); 在当前 string 对象的末尾追加一个 const string str 对象
7️⃣ string& operator+= (const char* s); 在当前 string 对象的末尾追加一个 c_string 字符串
8️⃣ string& operator+= (char c); 在当前 string 对象的末尾追加一个 c 字符
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s = "he";
	s += 'l';
	s += 'l';
	s += "o ";
	string temp = "world";
	s += temp;
	cout << s << endl;
	
	// output: hello world

	return 0;
}

🌟 元素的容量

序号 函数名称 功能
1️⃣ size_t capacity() const 返回当前 string 对象的容量大小
2️⃣ void reserve (size_t n = 0) 改变当前 string 对象的容量为 n
3️⃣ void resize (size_t n) 将当前 string 对象的 size() 调整为 n 并初始化为 '\0'
4️⃣ void resize (size_t n , char c) 将当前 string 对象的 size() 调整为 n 并初始化为 c
5️⃣ void clear(); 删除当前 string 对象的所有内容,size() = 0
6️⃣ bool empty() const 若当前 string 对象为空返回 true,否则返回 false

ps: reserve 是改变容量,而 resize 是改变 size() + 初始化,resizen 传的比 string 的大小还小,则就是删除。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s = "hello";
	cout << s.capacity() << endl;
	s.reserve(100);
	cout << s.capacity() << endl;
	cout << s.size() << endl; // 5
	
	string s2 = "hello world";
	s2.resize(5);
	cout << s2.size() << endl;	// 100
	cout << s2 << endl;
	s2.clear();
	cout << s2.empty() << endl;


	return 0;
}

output:


🌟 std::string::insert 插入


ps: 需要的查文档即可,效率不高很少用。

🌟 std::string::erase 删除


🌟 std::string::c_str 返回c的字符串

序号 函数名称 功能
1️⃣ const char* c_str() const 返回c的字符串使用 '\0' 结尾

🌟 查找

序号 函数名称 功能
1️⃣ size_t find (char c , size_t pos = 0) const 从当前 string 对象的 pos 位置开始查找 c 字符,返回这个字符第一次出现的位置,否则返回 string::npos
2️⃣ string substr (size_t pos = 0 , size_t len = npos) const 返回当前对象 pos 位置开始的 len 个字符的子串
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	string s = "hello world";
	size_t res = s.find('w' , 0);
	if (res != string::npos) {
		cout << s.substr(res) << endl;	// world
	}

	return 0;
}
序号 函数名称 功能
3️⃣ size_t rfind (char c , size_t pos = npos) const 从当前 string 对象的 pos 位置从后向前开始查找 c 字符,返回这个字符最后一次出现的位置,否则返回 string::npos

🌟 其他

序号 函数名称 功能
1️⃣ istream& getline (istream& is , string& str , char delim) 输入一行字符遇到 delim 终止
2️⃣ istream& getline (istream& is , string& str) 输入一行字符遇到 \n 终止
3️⃣ string to_string (int val) 返回一个 valstring 对象
4️⃣ int stoi (const string& str, size_t* idx = 0, int base = 10) 字符串转整数。 idx 通常都为 nullptrbase 代表进制

ps: to_string 支持的转换类型


ps: string 可以转换为的类型


cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {

	int val = 10;
	string s_val = to_string(val);
	cout << s_val << endl;	 // 10
	

	val = stoi(s_val);
	cout << val << endl;	// 10

	return 0;
}

相关推荐
北极无雪14 分钟前
Spring源码学习(拓展篇):SpringMVC中的异常处理
java·开发语言·数据库·学习·spring·servlet
猿小猴子25 分钟前
Python3 爬虫 中间人爬虫
开发语言·爬虫·python
lly20240632 分钟前
Swift 方法
开发语言
T0uken35 分钟前
【QT Quick】C++交互:QML对象操作
c++·qt·交互
YONG823_API1 小时前
电商平台数据批量获取自动抓取的实现方法分享(API)
java·大数据·开发语言·数据库·爬虫·网络爬虫
问道飞鱼1 小时前
每日学习一个数据结构-默克尔树(Merkle Tree)
数据结构·学习·默克尔树
寂柒1 小时前
C++——模拟实现stack和queue
开发语言·c++·算法·list
William_Edmund1 小时前
Python 语言学习——应用1.2 数字图像处理(第二节,变换)
人工智能·学习·计算机视觉
熬夜学编程的小王1 小时前
C++类与对象深度解析(一):从抽象到实践的全面入门指南
c++·git·算法
CV工程师小林1 小时前
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)
数据结构·c++·算法·leetcode·深度优先·剪枝