信奥竞赛

系列

剑指信奥 | C++ 之 STL - string

剑指信奥 | C++ 之 STL - string

什么是 STL

从今天开始,我们进入了 C++ 的一个宝库 — STL 标准模版库

标准模板库(英文:Standard Template Library,缩写:STL),是一个 C++ 软件库,大量影响了 C++ 标准程序库但并非是其的一部分。

STL 中包含 4 个组件,分别为算法、容器、函数、迭代器。

Wikepedia

STL 提供了很多非常有用的数据结构,如果没有 STL,比如说使用 C 语言,一些算法常用的数据结构我们要从头写起,全部都要自己构建,费时费力。

而这些常用的数据结构在 C++ 的 STL 里都是封装好的,只要拿来就可以使用。所以学好 STL 非常重要。

今天起,我们将开始介绍一系列的 STL 重要的内容,我们首先从最常用的 string 字符串开始。

string 的初始化

在 C++ 中,我们首先引入 string 标准库,这里有着很多和字符串有关的操作,我们先来看一下字符串的各种初始化方式。

#include <iostream>
#include <string>

using namespace std;

int main() {

// 初始化空字符串
string str1;
// 直接初始化字符串
string str2 = "abc";
// 深拷贝初始化字符串
string str3 = str2;
// 构造字符串 "abcde"
string str4("abcde");
// 深拷贝初始化字符串
string str5(str2);
// 复制字符串 str4 从第 0 + 1 个开始复制 3 个字符
string str6(str4, 0, 3);
// 创建一个字符数组 ch
char ch[] = "abcde";
// 构造字符串为 ch 的前 3 个字符
string str7(ch, 3);
// 构造字符串为 5 个 'a' 字符
string str8(5, 'a');
// 构造字符串为 str3 从起始到结束
string str9(str3.begin(), str3.end());

cout << "str1 = " << str1 << endl;
cout << "str2 = " << str2 << endl;
cout << "str3 = " << str3 << endl;
cout << "str4 = " << str4 << endl;
cout << "str5 = " << str5 << endl;
cout << "str6 = " << str6 << endl;
cout << "str7 = " << str7 << endl;
cout << "str8 = " << str8 << endl;
cout << "str9 = " << str9 << endl;

return 0;
}
/*
output:
str1 =
str2 = abc
str3 = abc
str4 = abcde
str5 = abc
str6 = abc
str7 = abc
str8 = aaaaa
str9 = abc
*/

字符串在 C++ 中有着非常多的初始化方式,在实际中可以根据我们的需要选择最适合的初识化方法。

string 的操作

在我们初始化字符串后,就可以根据需要使用 string 库提供的多种函数对字符串进行各种操作。

我们在这里列举部分常用的操作,并用精简的代码加以示例。

  1. length()size()
#include <iostream>
#include <string>

using namespace std;

int main() {

string str = "abcde";

// 字符串的长度
cout << "str.length() = " << str.length() << endl;
cout << "str.size() = " << str.size() << endl;

return 0;
}

/*
output:
str.length() = 5
str.size() = 5
*/

这两个函数都可以求得一个字符串的长度,就是字符的个数,作用是一样的,使用哪个都可以。

  1. []at()
#include <iostream>
#include <string>

using namespace std;

int main() {

string str = "abcde";

// 字符串的长度
cout << "str[2] = " << str[2] << endl;
cout << "str.at(3) = " << str.at(3) << endl;

return 0;
}

/*
output:
str[2] = c
str.at(3) = d
*/

字符串也可以看作是一种 容器 container,是关于 字符 的容器,我们可以使用元素下标或 at() 函数来访问字符串中的字符元素。

  1. compare()
#include <iostream>
#include <string>

using namespace std;

int main() {

string str1 = "abcde" ,str2 = "abCde", str3="abcde";

// 字符串的长度
cout << "str1.compare(str2) = " << str1.compare(str2) << endl;
cout << "str1.compare(str3) = " << str1.compare(str3) << endl;

return 0;
}

/*
output:
str1.compare(str2) = 32
str1.compare(str3) = 0
*/

compare() 函数可以把两个字符串加以比较,相同的字符串比较返回零,否则返回非零值。

  1. find()
#include <iostream>
#include <string>

using namespace std;

int main() {

string str1 = "abcde", str2 = "abCde", str3 = "c";


// 字符串的长度
cout << "str1.find(str3) = " << str1.find(str3) << endl;
cout << "str2.find(str3) = " << str2.find(str3) << endl;
cout << "string::nops = " << string::npos << endl;

return 0;
}

/*
output:
str1.find(str3) = 2
str2.find(str3) = 18446744073709551615
string::nops = 18446744073709551615
*/

find() 用于在字符串中查找子串,找到返回子串的索引,否则返回 string::nops

  1. getline()
#include <iostream>
#include <string>

using namespace std;

int main() {

string name;

cout << "input your name:" << endl;
getline(cin, name);
cout << "Your name is " << name << endl;

return 0;
}

/*
output:
input your name:
Tom
Your name is Tom
*/

getline() 函数可以用于接收字符串的输入。

  1. substr()
#include <iostream>
#include <string>

using namespace std;

int main() {

string str = "Hello, String!";

cout << "substr: " << str.substr(7, 6) << endl;

return 0;
}

/*
output:
substr: String
*/

substr() 函数用于截去字符串的子串,从第一个参数的位置开始,截取第二个参数个字符。

以上就是我们列举的部分字符串库中的几个常用的函数,字符串还有很多有用的函数有待于我们去探索。

字符串在各种编程语言中都是很常用的,熟练掌握字符串的初始化和各种操作是非常重要的。