string
string
string 作为类出现,其集成的操作函数足以完成多数情况下的需要。可以使用 "=" 进行赋值,使用 "==" 进行等值比较,使用 "+" 做串联。
要使用 string 类,必须包含头文件 <string>
。在 STL 库中,basic_string 有两个预定义类型:包含 char 的 string 类型和包含 wchar 的 wstring 类型。
int main() { string stuff; // 从屏幕读入输入的字符串 cin >> stuff; // 或者 getline(cin, stuff); }
成员函数
在定义 string 类对象时,string 类自身可以管理内存,程序员不必关注内存的分配细节。
string 类提供的各种操作函数大致分为八类:构造器和析构器、大小和容量、元素存取、字 符串比较、字符串修改、字符串接合、I/O 操作以及搜索和查找。
函数名称 | 功能 |
---|---|
构造函数 | 产生或复制字符串 |
析构函数 | 销毁字符串 |
=,assign | 赋以新值 |
swap() |
交换两个字符串的内容 |
+ =,append() ,push_back() |
添加字符 |
insert () |
插入字符 |
erase() |
删除字符 |
clear() |
移除全部字符 |
resize() |
改变字符数量 |
replace() |
替换字符 |
+ | 串联字符串 |
==,! =,<,<=,>,>=,compare() |
比较字符串内容 |
size() ,length() |
返回字符数量 |
max_size() |
返回字符的最大可能个数 |
empty() |
判断字符串是否为空 |
capacity() |
返回重新分配之前的字符容量 |
reserve() |
保留内存以存储一定数量的字符 |
[],at() |
存取单一字符 |
>>,getline() |
从 stream 中读取某值 |
<< | 将值写入 stream |
copy() |
将内容复制为一个 C - string |
c_str() |
将内容以 C - string 形式返回 |
data() |
将内容以字符数组形式返回 |
substr() |
返回子字符串 |
find() |
搜寻某子字符串或字符 |
begin() ,end() |
提供正向迭代器支持 |
rbegin() ,rend() |
提供逆向迭代器支持 |
get_allocator() |
返回配置器 |
构造函数
int main() { // 生成空字符串 string str; str = "hello"; // 生成字符串str的复制品 string s1(str); // 将字符串 str 中始于下标 2 的部分作为构造函数的初值 string s2(str, 2); // 将字符串 str 中始于下标 1、长度为 2 的部分作为字符串初值 string s3(str, 1, 2); // 以 C_string 类型作为字符串s的初值 string s4("C_string"); // 以 C_string 类型的前 2 个字符串作为字符串s的初值 string s5("C_string", 2); // 生成一个字符串,包含 6 个 c 字符 string s6(6, 'c'); //以区间 [1, 2] 内的字符作为字符串s的初值 string s7("hello", 1, 2); // 只包含一个字符 string s8(1, 'x'); string s9("x"); // 错误:string s10('x'); }
C_string 一般被认为是常规的 C++字符串。目前,在 C++ 中确实存在一个从 const char * 到 string 的隐式型别转换,却不存在从 string 对象到 C_string 的自动型别转换。对于 string 类型的字符串,可以通过 c_str() 函数返回该 string 类对象对应的 C_string。
程序员在整个程序中应坚持使用 string 类对象,直到必须将内容转化为 char* 时才将其转换为 C_string。
compare()
类 basic_string 的成员函数 compare() 的原型如下:
int compare(const basic_string &s) const; int compare(const Ch *p) const; int compare(size_type pos, size_type n, const basic_string &s) const; int compare(size_type pos, size_type n, const basic_string &s, size_type pos2, size_type n2) const; int compare(size_type pos, size_type n, const Ch *p, size_type = npos) const;
如果在使用 compare() 函数时,参数中出现了位置和大小,比较时只能用指定的子串。例如:
s.compare {pos,n, s2);
若参与比较的两个串值相同,则函数返回 0;若字符串 S 按字典顺序要先于 S2,则返回负值;反之,则返回正值。
在使用时比较运算符时,包括 >、<、==、>=、<=、!=,对于参加比较的两个字符串,任一个字符串均不能为 NULL
,否则程序会异常退出。
修改
可以通过使用多个函数修改字符串的值。例如 assign()
,operator=,erase()
,交换(swap),插入(insert)等。另外,还可通过 append()
函数添加字符。
int main() { string str1("123456"); string str2("abcdefghijklmn"); string str; // 赋值全部 str.assign(str1); // 赋值子串 str.assign(str1, 3, 3); // 赋值从位置 2 至末尾的子串 str.assign(str1, 2, string::npos); // 重复 5 个'X'字符 str.assign(5, 'X'); //从第 1 个至倒数第 2 个元素,赋值给字符串 str auto itB = begin(str1); auto itE = end(str1); str.assign(itB, (--itE)); str = str1; // 抹除下标 2 到结尾的字符 str.erase(2); // 抹除开头到结尾 str.erase(str.begin(), str.end()); // 交换 str.swap(str2); string A("ello"); string B("H"); // 字符串插入到下标 1 的位置,B: Hello B.insert(1, A); B = 'H'; // 字符串前 3 个插入到下标 1 的位置,B: Habc B.insert(1, "abcde ", 3); A = "ello"; B = "H"; // 字符串A从下标 2 开始的 2 个字符插入到B下标 1 的位置,B: Hlo B.insert(1, A, 2, 2); B = "H"; // 下标 1 处插入 5 个 C,B:HCCCCC B.insert(1, 5, 'C'); A = "ello"; B = "H"; auto it = B.begin() + 1; auto itF = begin(A); auto itG = end(A); // B: Hello B.insert(it, itF, itG); A = "ello"; B = "H"; // 追加,B: Hello B.append(A); B = "H"; // 追加前两个字符,B: H12 B.append("12345", 2); B = "H"; // 追加下标 2 开始的 3 个字符,B: H345 B.append("12345", 2, 3); B = "H"; // 追加下标 5 个 a,B: Haaaaa B.append(5, 'a'); A = "ello"; B = "H"; // 追加范围,B: Hello B.append(A.begin(), A.end()); cout << "append: " << B << endl; return 0; }
替换
int main() { string var("abcdefghijklmn"); const string dest("1234"); string dest2("567891234"); // var: abc1234ghijklmn var.replace(3, 3, dest); var = "abcdefghijklmn"; // var: abc234efghijklmn var.replace(3, 1, dest.c_str(), 1, 3); var = "abcdefghijklmn"; // var: abcxxxxxefghijklmn var.replace(3, 1, 5, 'x'); string::iterator itA, itB; string::iterator itC, itD; itA = var.begin(); itB = var.end(); var = "abcdefghijklmn"; // var: 1234 var.replace(itA, itB, dest); itA = var.begin(); itB = var.end(); itC = dest2.begin() + 1; itD = dest2.end(); var = "abodefghijklmn"; // var: 67891234efghijklmn var.replace(itA, itB, itC, itD); var = "abcdefghijklmn"; // var: abc1234efghijklmn // 这种方式会限定字符串替换的最大长度 var.replace(3, 1, dest.c_str(), 4); return 0; }
输入输出
"<<" 和 ">>" 提供了 C++ 语言的字符串输入和字符串输出功能。"<<" 可以将字符读入一个流中(例如 ostream);">>" 可以实现将以空格或回车为 "结束符" 的字符序列读入到对应的字符串中,并且开头和结尾的空白字符不包括进字符串中。
int main() { string s1, s2; // 该函数可将整行的所有字符读到字符串中。 // 在读取字符时,遇到文件结束符、分界符、回车符时,将终止读入操作,且文件结束符、分界符、回车符在字符串中不会保存; // 当已读入的字符数目超过字符串所能容纳的最大字符数时,将会终止读入操作。 // 第 1 个参数是输入流;第 2 个参数是保存输入内容的字符串 getline(cin, s1); // 第 1 个参数是输入流,第 2 个参数保存输入的字符串,第 3 个参数指定分界符。 getline(cin, s2, '$'); }
字符串查找
若查找 find()
函数和其他函数没有搜索到期望的字符(或子串),则返回 npos
;若搜索成功,则返回搜索到的第 1 个字符或子串的位置。其中,npos
是一个无符号整数值,初始值为 -1。当搜索失败时, npos
表示“没有找到(not found)”或“所有剩佘字符”。
所有查找 find()
函数的返回值均是 size_type
类型,即无符号整数类型。该返回值用于表明字符串中元素的个数或者字符在字符串中的位置。
find()函数和 rfind()
find()
函数的原型主要有以下 4 种:
// find()函数的第1个参数是被搜索的字符、第2个参数是在源串中开始搜索的下标位置 size_type find(value_type _Chr, size_type _Off = 0) const; // find()函数的第1个参数是被搜索的字符串,第2个参数是在源串中开始搜索的下标位置 size_type find(const value_type *_Ptr, size_type _Off = 0) const; // 第1个参数是被搜索的字符串,第2个参数是源串中开始搜索的下标,第3个参数是关于第1个参数的字符个数,可能是 _Ptr 的所有字符数,也可能是 _Ptr 的子串宇符个数 size_type find(const value_type *_Ptr, size_type _Off = 0, size_type _Count) const; // 第1个参数是被搜索的字符串,第2参数是在源串中开始搜索的下标位置 size_type find(const basic_string &_Str, size_type _Off = 0) const;
rfind()
函数的原型和 find()
函数的原型类似,参数情况也类似。只不过 rfind()
函数适用于实现逆向查找。
int main() { string str("0123for789abcfor"); int len = str.length(); cout << endl << str.find('2', 0);// 2 cout << endl << str.rfind('c', len - 1);// 12 cout << endl << str.find("for", 0);// 4 cout << endl << str.rfind("for", len - 1);// 13 }
find_first_of()函数和 find_last_of()函数
find_first_of()
函数可实现在源串中搜索某字符串的功能,该函数的返回值是被搜索字符串的第 1 个字符第 1 次出现的下标(位置)。若查找失败,则返回 npos
。
find_last_of()
函数同样可实现在源串中搜索某字符串的功能。与 find_first_of()
函数所不同的是,该函数的返回值是被搜索字符串的最后 1 个字符的下标(位置)。若查找失败,则返回 npos
。
find_first_not_of()函数和 find_last_not_of()函数
find_first_not_of()
函数可实现在源字符串中搜索与指定字符(串)不相等的第 1 个字符;find_last_not_of()
函数可实现在源字符串中搜索与指定字符(串)不相等的最后 1 个字符。这两个函数的参数意义和前面几个函数相同,它们的使用方法和前面几个函数也基本相同。
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18385108
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步