C++_string 容器的常见用法

C++ 提供了两种类型的字符串表示形式:C 语言类型和引入的 string 类。在某些场景下,使用新的 string 类来处理字符串十分方便,这里介绍一下其常见的用法。

定义

如果要使用 string,需要添加 string 头文件。但在 C++ 11 中,iostream 这个头文件内好像已经包含了 string ,具体如何,这里不做讨论。
定义 string 的方式跟基本数据类型相同,只需要在 string 后面跟上变量名即可:

1
string str;

如果要初始化,就需要直接对 string 类型的变量赋值:

1
string str = "abcd";

有时候需要一个含有 n 个相同字符的字符串,此时可以利用 string 的构造函数完成:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main() {
string str = string(4, 'a');
cout << str << endl;
return 0;
}
/*
out:
aaaa
*/

还可以用构造函数完成截取字符串的操作:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main() {
string str = "abcd";
string s = string(str, 1, 3);
cout << s << endl;
return 0;
}
/*
out:
bcd
*/

访问

C++ 提供了两种多种访问 string 类的方式。

通过下标访问

C++ 可以通过下标直接访问到 string 类型变量的每一个字符变量,如:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main() {
string str = "abcde";
for(int i = 0; i < str.length(); i++) {
cout << str[i] << ' ';
}
}
/* out:
a b c d e
*/

访问单个字符还可以通过 at 函数来完成:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main() {
string str = "abcde";
for(int i = 0; i < str.length(); i++) {
cout << str.at(i) << ' ';
}
}
/* out:
a b c d e
*/

如果要输入或输出整个字符串,就得用 cin 和 cout:

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;

int main() {
string str;
cin >> str;
cout << str;
}

硬要用 scanf 和 printf 也是可以的,如:

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;

int main() {
string str;
scanf("%s", str.c_str());
printf("%s", str.c_str());
}

通过迭代器访问

string 类与其他 STL 容器一样,也是支持用迭代器访问的,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main() {
string str = "abcde";
string::iterator it = str.begin();
for(; it != str.end(); it++) {
cout << *it << ' ';
}
}
/* out:
a b c d e
*/

这个用法有点类似指针,另外,it + 2str[2]表示的是同一个字符。

操作符

operator +=

这是 string 的加法,类似 C 语言中的 strcat,java 里面也有类似的用法,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main() {
string str1 = "abcde";
string str2 = "efghi";
string str3 = str1 + str2;
str1 = str1 + str2;
cout << str1 << endl << str3 << endl;;

}
/* out:
abcdeefghi
abcdeefghi
*/

注意:string 类可没有 +、/、×,不要惯性思考了。

compare operator

两个 string 类型的变量可以直接用 <、>、==、<=、>=、!= 直接进行比较,规则是按字典序逐个字符进行比较,这个功能类似 C 语言中的 strcmp,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main() {
string str1 = "aa", str2 = "aaa", str3 = "abc", str4 = "xyz";
if(str1 < str2) printf("1\n");
if(str1 != str3) printf("2\n");
if(str4 >= str3) printf("3\n");

}
/* out:
1
2
3
*/

常用函数

相较于 C 语言,string 类封装了很多常用的字符串操作函数,可以直接拿来用,很方便。

length/size

length 和 size 返回 string 的长度,也就是字符串的长度,如:

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;

int main() {
string str1 = "aaa", str2 = "11aaa";
cout << str1.size() << ' ' << str2.length();
}
/* out:
3 5
*/

insert

insert 的用法有很多,这里只列举常见的几个用法。

字符串中插入字符串

基本写法:str1.insert(pos, str2),在 str1 的 pos 这个位置,插入字符串 str2,如:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main() {
string str1 = "aaz", str2 = "11aaa";
str1.insert(2, str2);
cout << str1;
}
/* out:
aa11aaaz
*/

还可以使用迭代器来完成,如:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main() {
string str1 = "aaz", str2 = "11aaa";
str1.insert(str1.begin() + 2, str2.begin(), str2.end());
cout << str1;
}
/* out:
aa11aaaz
*/

字符串中插入多个字符

基本写法:str1.insert(pos, count, ch),在 str1 的 pos 这个位置,插入 count 个字符 ch,如:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main() {
string str1 = "aaz";
str1.insert(2, 1, 'c');
cout << str1;
}
/* out:
aacz
*/

同样,也可以使用迭代器来完成。
参考链接:C++ string类insert用法总结

erase

erase 可以用来删除单个字符或一个区间内的所有字符。

删除单个字符

基本写法:str1.erase(it),it 为要删除的字符的迭代器,如:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main() {
string str1 = "abcde";
str1.erase(str1.begin() + 2);
cout << str1;
}
/* out:
abde
*/

删除一个区间内的字符

删除一个区间内的字符有两种方法,str1.erase(first, last)str1.erase(pos, length),也就是区间的写法。第一种写法 first 与 last 必须要是迭代器,删除的区间是[first, last),左闭右开;第二种写法中 pos 为需要开始删除的起始位置,length 为删除的字符个数,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main() {
string str1 = "abcdefg", str2;
str2 = str1;
str1.erase(str1.begin() + 2, str1.end() - 1);
cout << str1 << endl;
str2.erase(2, 4);
cout << str2;
}
/* out:
abg
abg
*/

参考链接:c++ string的erase删除方法

clear

clear 用来清空 string 中的数据,如:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main() {
string str1 = "abcdefg";
str1.clear();
cout << str1.length();
}
/* out:
0
*/

substr

substr 用来返回子串,基本写法:str.substr(pos, len),即返回从 pos 开始,长度为 len 子串,如:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main() {
string str1 = "abcdefg", str2;
str2 = str1.substr(3, 3);
cout << str2;
}
/* out:
def
*/

也可以直接写str.substr(pos),会直接返回从 pos 开始,直到字符串结尾的子串。

find

find 用来查找子串,这个子串也可以是一个字符,基本写法:str.find(str2)str.find(str2, pos),如果不加参数 pos,那么 find 会返回 str2 在 str 中第一次出现的位置,否则就返回 string::npos(是一个常数,本身的值是 -1,但由于它是 unsigned_int 类型,所以也可以认为是 4294967295)。而加了 pos 后,就会从 str 的第 pos 个位置开始匹配 str2,返回值与不加 pos 一致。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;

int main() {
string str = "hello world";
string str1 = "llo", str2 = "you";
cout << str.find('e') << endl;
if(str.find(str1) != string::npos) cout << str.find(str1) << endl;
if(str.find(str1, 2) != string::npos) cout << str.find(str1, 2) << endl;
if(str.find(str2) != string::npos) cout << str.find(str2) << endl;
else cout << "no pos" << endl;
}
/* out:
1
2
2
no pos
*/

参考链接:C++ string中的find()函数

replace

replace 用来替换子串,基本用法:str.replace(pos, len, str2)str.replace(it1, it2, str2)。第一种写法是把 str 从第 pos 个位置开始、长度为 len 的子串替换为 str2;第二种写法是把 str 的迭代器 [it1, it2) 范围的子串替换为 str3,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main() {
string str = "Maybe you will turn around.";
string str2 = "will not";
string str3 = "surely";
cout << str.replace(10, 4, str2) << endl;
cout << str.replace(str.begin(), str.begin() + 5, str3) << endl;
}
/* out:
Maybe you will not turn around.
surely you will not turn around.
*/

to_string

to_string 用来将数值转化为字符串,基本用法:string num = to_string(1234213),如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main() {
string str = to_string(1234567);
cout << str << endl;
str = to_string(1.223563333);
cout << str << endl;
str = to_string(-121);
cout << str << endl;
}
/* out:
1234567
1.223563
-121
*/

这个函数,处理某些问题时,可能有奇效。
参考链接:c++ to_String()

append

append 函数用来向字符串末尾添加字符或另一个字符串,基本用法:str.append(5, '+')str1.append(str2),如:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main() {
string str1 = "abcd", str2 = "efgh";
cout << str1.append(5, '+') << endl;
cout << str1.append(str2) << endl;
return 0;
}
/* out:
abcd+++++
abcd+++++efgh
*/

参考链接:C++中string append函数的使用与字符串拼接

pop_back/push_back

严格来讲,这两个函数应该是从基类继承过来的(盲猜一下 string 的基类估计是 vector 😂),用法上与 vector 中的 push_back 和 pop_back 无差别:

1
2
3
4
5
string str = "aaa"
// 在 str 末尾添加一个字符 b
str.push_back('b');
// 在 str 末尾删除一个字符
str.pop_back();


Buy me a coffee ? :)
0%