算法-字符串string

严格说,和int128一样,string不属于算法,但为了便于归类才标记为算法。

前言

觉得char[]难用?一起来用string吧!

使用方法

一般地,同为数据类型,大部分的操作都可以参考int类型变量。

输入/输出

如果输入以空格或换行符分隔,可以直接使用cin

1
2
string str;
cin >> str;

如果希望输入一整行(包括空格)的话,可以使用getline

1
2
string str;
getline(cin, str);

注意:在使用getline前,如果使用过cin,必须先清空输入流!

1
2
3
4
5
string str1, str2;
cin >> str;
cin.clear();
cin.ignore();
getline(cin, str2);

输出直接用cout即可。

1
2
string str = "wither_ixg";
cout << str << endl; // wither_ixg

由于string并不是C语言的内容(而是C++),所以scanfprintf不支持string当然也有特殊的方法,在此不多展开

定义

int一样,string类型变量也有以下定义方式(任选一种):

1
2
3
4
string part1 = "wither";
string part2("_");
string part3{"ixg"};
cout << part1 << part2 << part3 << endl; // wither_ixg

不过特殊的是,string类型还有很多初始化的方法(称为构造函数),在此额外补充一个常用的:

1
2
string str1(5, 'a'); // "aaaaa"
string str2(6, 'b'); // "bbbbbb"

转换

实际使用时,会经常需要将int等类型转化成字符串。

C++11之后,可以使用to_string函数完成这一操作:

1
2
int num = 10000;
string str = to_string(num); // "10000"

基本操作

获取长度

使用length(如果你把它看作数组)或size(STL通用的名称)即可,两个函数没有任何区别

1
2
3
string str = "wither_ixg";
int len1 = str.length(); // 10
int len2 = str.size(); // 10

比较(ASCII码)

最简单的比较方式:

1
2
3
string str1 = "abc", str2 = "abd", str3 = "abe";
cout << (str2 > str1) << endl; // 1
cout << (str2 > str3) << endl; // 0

类似strcmp的比较方式:

1
2
3
string str1 = "abc", str2 = "abd", str3 = "abe";
cout << (str2.compare(str1)) << endl; // 1
cout << (str2.compare(str3)) << endl; // -1

添加

下面是一种最简单的做法:

1
2
3
string str = "wither";
str += '_'; // wither_
str += "ixg"; // wither_ixg

如果想在指定位置插入,使用insert

1
2
3
string str = "_ixg";
str.insert(0, "w"); // w_ixg
str.insert(1, "ither"); // wither_ixg

删除

使用erase(from, len),其中from代表从哪开始,len代表长度:

1
2
3
string str = "withhhhhhhher_ixg";
// Hint: ^^^^^^^
str.erase(4, 7); // wither_ixg

替换

使用replace(from, len, str),其中from代表从哪开始,len代表长度,str代表要替换成什么字符串:

1
2
3
string str = "with++++++++ixg";
// Hint: ^^^^^^^^
str.replace(4, 8, "er_"); // wither_ixg

获取字符

类似于数组:

1
2
string str = "abc";
char ch = str[0]; // 'a'

查找

使用findrfind函数,其中r代表从右开始查找。

find为例:

  • 如果使用find(str),代表从左到右查询第一次遇到字符串str的位置。
1
2
3
4
string str = "wither_ixg";
str.find("i"); // 1
str.rfind("i"); // 7
str.rfind("ixg"); // 7
  • 如果使用find(str, from),代表从from的下标开始,查询第一次遇到字符串str的位置。
1
2
3
string str = "wither_ixg";
// Hint: |-->
str.find("i", 7); // 7

特别地,如果find函数找不到匹配的位置,会返回一个很大的整数string::npos,也就是18446744073709551615

注:string::npos就是一个普通的整型常量,只是形式上有些奇怪?

截取

使用substr(from, len),其中from代表从哪开始,len代表长度:

1
2
3
string str = "wwwwither_ixgggg";
// Hint: ^^^^^^^^^^
string new_str = str.substr(3, 10); // wither_ixg

排序

vector类似,可使用sort排序:

1
2
3
string str = "qazwsxedcrfvtgbyhnujmikolp";
sort(str.begin(), str.end());
cout << str << endl; // abcdefghijklmnopqrstuvwxyz

总结

操作 函数名 解释
获取长度 str.length()/str.size() 两个函数没有区别
比较 str1 < str2/str1.compare(str2) 前者返回bool值,后者返回-1/0/1
添加 str1 += x x可以是char,也可以是string
删除 str.erase(from, len) 从下标from开始,连续删除len个字符
替换 str1.replace(from, len, str2) 从下标from开始,将连续len个字符替换为str2
获取字符 str[index] 和数组的操作类似
查找 str1.find(str2)/str1.find(str2, index) (从下标index)往后找,返回位置的下标(找不到返回string::npos)
截取 str.substr(from, len) 从下标from开始,连续截取len个字符
排序 sort(str.begin(), str.end()) 类似vector的排序