算法-字符串string
严格说,和int128一样,string不属于算法,但为了便于归类才标记为算法。
前言
觉得char[]难用?一起来用string吧!
使用方法
一般地,同为数据类型,大部分的操作都可以参考int类型变量。
输入/输出
如果输入以空格或换行符分隔,可以直接使用cin。
1 | string str; |
如果希望输入一整行(包括空格)的话,可以使用getline。
1 | string str; |
注意:在使用getline前,如果使用过cin,必须先清空输入流!
1 | string str1, str2; |
输出直接用cout即可。
1 | string str = "wither_ixg"; |
由于string并不是C语言的内容(而是C++),所以scanf和printf不支持string当然也有特殊的方法,在此不多展开。
定义
和int一样,string类型变量也有以下定义方式(任选一种):
1 | string part1 = "wither"; |
不过特殊的是,string类型还有很多初始化的方法(称为构造函数),在此额外补充一个常用的:
1 | string str1(5, 'a'); // "aaaaa" |
转换
实际使用时,会经常需要将int等类型转化成字符串。
C++11之后,可以使用to_string函数完成这一操作:
1 | int num = 10000; |
基本操作
获取长度
使用length(如果你把它看作数组)或size(STL通用的名称)即可,两个函数没有任何区别。
1 | string str = "wither_ixg"; |
比较(ASCII码)
最简单的比较方式:
1 | string str1 = "abc", str2 = "abd", str3 = "abe"; |
类似strcmp的比较方式:
1 | string str1 = "abc", str2 = "abd", str3 = "abe"; |
添加
下面是一种最简单的做法:
1 | string str = "wither"; |
如果想在指定位置插入,使用insert。
1 | string str = "_ixg"; |
删除
使用erase(from, len),其中from代表从哪开始,len代表长度:
1 | string str = "withhhhhhhher_ixg"; |
替换
使用replace(from, len, str),其中from代表从哪开始,len代表长度,str代表要替换成什么字符串:
1 | string str = "with++++++++ixg"; |
获取字符
类似于数组:
1 | string str = "abc"; |
查找
使用find和rfind函数,其中r代表从右开始查找。
以find为例:
- 如果使用
find(str),代表从左到右查询第一次遇到字符串str的位置。
1 | string str = "wither_ixg"; |
- 如果使用
find(str, from),代表从from的下标开始,查询第一次遇到字符串str的位置。
1 | string str = "wither_ixg"; |
特别地,如果find函数找不到匹配的位置,会返回一个很大的整数string::npos,也就是18446744073709551615。
注:string::npos就是一个普通的整型常量,只是形式上有些奇怪?
截取
使用substr(from, len),其中from代表从哪开始,len代表长度:
1 | string str = "wwwwither_ixgggg"; |
排序
和vector类似,可使用sort排序:
1 | string str = "qazwsxedcrfvtgbyhnujmikolp"; |
总结
| 操作 | 函数名 | 解释 |
|---|---|---|
| 获取长度 | 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的排序 |