C++ string
类型学习笔记
@(C/C++学习笔记)
实话说string
类型着实是一种讨厌的数据结构,说它讨厌并不是它到底有多么复杂,而是用的实在太少,等到突然要用的时候又不知道该怎么初始化,有哪些接口,有哪些坑要注意。今天(20.9.12)在一道leetcode题中遇到该类型,所以抓住机会,尽可能熟悉一下,就这两天吧。
文章目录
初始化string
类型
string
是个类类型啊,就像所有的类类型一样,俩初始化方式:直接初始化,拷贝构造函数初始化。
//直接初始化
string s1("tempstring");
string s2(10,'a');//这里只能是字符,不能是字符串
string s3("abc");
//拷贝初始化
string s4 = s3;
string s5 = "tempstring";
string
类型基本操作
数据访问
string
类型的数据访问和vector
类型一样,使用[]
操作符进行。类似的,也可以使用size()
和empty()
获得元素数量(不包含末尾的\0
)和判断是否为空串(true
)。
运算符重载
总体而言,重载后的功能接近对内置类型的操作。
+
:拼接,注意:拼接的是string
类型,不是字符串类型。但是可以通过隐式类型转换将字符串类型转换成string
类型:要保证+
两边至少有一个string
类型。=
:赋值==
,<
,>
,<=
,>=
:长度相等,字符一样,则相等;长度不一样,但字符对应一样,则根据长度比较;否则,以第一对不相等的字符作为比较依据。
输入
cin
以空白字符作为输入间隔;getline(is,string type)
以换行作为输入间隔。
对每一个字符的操作
cctype
库中存在大量对单个字符的操作:检查是否是字母、数字、标点、可打印字符、控制字符、空白、大写字母、小写字母,或者是将大写替换为小写、将小写替换为大写。
另外在C++11出现了一种基于范围的for
语句:
for(declaration:expression)
statement
其中,expression
为一个序列对象,比如string
。然后declaration
指代序列对象中的一个元素,可以是引用,然后循环进行操作。
string
进阶操作
构造&初始化
string s(cp,n);
// s是cp所指向数组的前n个元素的拷贝,数组得是char,不要想什么int了,后者简直是流氓行为。
string s2(s,pos2,n);
//s2是s从下标pos2开始n个字符的拷贝
string s3 = s2.substr(pos3,n);
//s3是s2从下标pos3位置开始的n个字符的拷贝
在上式中n
,均可省略,可大可小,如果超过了数组或者string s
的长度,就只能拷贝到数组或者string s
尾部。那么问题来了,string s
以\0
作为结尾,数组的结尾是什么呢?所以说数组的结尾也得是\0
才能搞一个很大的n
或者省略n
。
改变string
的种种操作
这里要不要说的详细一点呢?太详细了好像也记不住啊。
- 首先是插入操作
关于insert
,它不仅仅可接受迭代器作为参数,还可以接受数组下标,但大同小异:先声明插入位置(end()
还是size()
);然后声明插入内容(string
);最后还可以声明插入长度。
//比如迭代器
string s1 = "wendell is me";
string s2 = "how are you";//怎么是你?
s2.insert(s2.begin()+x,s1.begin(),s1.end());
//再比如下标
string s3 = "how old are you"//怎么老是你?
s3.insert(15,2,'?');
s3.insert(15,s1,3);
- 然后是删除(
erase()
)
俩参数:头,长度。 - 接着是追加(
append()
)
这就一push_back()
没什么好说的 - 最后是替换(````replace()
) 仨参数:头、长度、换成啥。或者说:
s2.replace(beg,len,s1) =s2.erase(beg,len)+s2.insert(beg,s1)```
这样是不是清晰了呢,我可真是个小机灵鬼
查找
string
有六种查找方式。符合条件返回位置,否则返回string::npos
。(语言开发者真的好闲啊)
s.find(args)
,从s
中查找字符串或者字符args
第一次出现的位置s.rfind(args)
,查找最后一次出现的位置s.find_first_of(string s1)
,查s1
中的字符在s
中的第一次出现位置s.find_last_of(string s1)
,最后一次s.find_first_not_of(string s1)
,查s
中第一个不在s1
中的字符的位置s.find_last_not_of(string s1)
,最后一个
另外上述六种方法均可指定查找范围。
比较(compare()
)
从哪里开始,长度是多少,和谁比较,它从哪儿开始,它的长度是多少。除了比较对象剩下的都可以删除。返回值根据比较结果来。
数值转换
- 数值到
string
string s = to_string(val)
string s
到数值:stoi
,stof
,stod
,stol
…参数为s
,s
起始位置,长度。