目录
一、string构造函数接口(Construct string object)
这个接口我在string(二)中详细说明了,在此不再赘述。
详情可见博客————
https://blog.csdn.net/SAKURAjinx/article/details/127585347
与构造函数相对,~string()是析构函数,在对象脱离其作用域(例如它所在函数调用结束)时系统自动调用,清理释放对象开辟的空间。
它有三种用法,单个字符赋值、字符串赋值、string对象赋值。
- string s1 = "a";
- string s2 = "hello";
- string s3 = s1 + s2;
begin、end为正向迭代器,rbegin、rend为反向迭代器;cbegin、cend为const正向迭代器,crbegin、crend为const反向迭代器。
在string(二)中详细介绍了,在此不多赘述。
https://blog.csdn.net/SAKURAjinx/article/details/127585347
string是字符串,length表示长度,size表示大小,应该都能显示字符串当前长度,那为什么会存在两个意义相同的接口呢?
这个接口目前来看没有什么意义,也基本不会用到,是设计问题。
1、 capacity是容量,不是指string的长度,而是指string目前所能容纳的字符数。它是const修饰的,无法通过该接口直接修改容量大小,除非用reserve接口改变。
这里的capacity在不同平台下也有不同,像g++编译器下capacity计算的是string的所有字符数(包括 \0 );而像VS 2013下计算的是string的有效字符数(不包括 \0),这种差别也体现在扩容等接口上(Push_back)。
2、empty接口是用来判断string是否长度为0,可用作循环结束条件。
reserve是保留的意思,它可以为capacity预留足够的空间。
原本capacity的大小是15,reserve(30)后变为31,VS 2013平台下大致是按(n*16-1)的方式扩容的。
resize可以改变size的大小,它的用处比较广,主要是分三种情况:
1、resize参数比size小
此时会截去多余部分,只改变size,不改变capacity。
2、resize参数介于size和capacity之间
此时会填补size到capacity之间的位置(用空字符 \0)
3、resize参数比capacity大
此时会扩容,而后填补size与capacity之间的位置,同样是用 \0
缩减string的容量capacity,使得它能符合size 的大小,不一定是要和size一样大,可以比size略大,只要在合理范围内。
一、运算符重载operator [ ]
对[ ] 进行重载,使用下标进行元素访问。
二、at 接口
std :: string :: at可用于从字符串中提取字符。
它会自动进行检查,如果越界将会抛异常。
三、front、back
分别替换头尾的字符。用得不多,毕竟有size存在。
append是在string后面添加字符串,有6种方式:
1、直接添加其他string对象
2、添加string对象的部分,从第subpos位开始,尾插sublen个字符
3、直接添加字符串
4、添加一个字符串的前n个字符
5、添加n个C字符
6、添加一个string对象的部分,从first 到 last
push_back在string后面增加一个字符。
pop_back截去string末尾的一个字符。
insert 与 erase 是在字符串任意位置插入、删除数据,用得不多,如果不是在头尾插入删除数据会涉及移动数据降低效率,所以一般是用头插尾删。
assign是用一个新的字符串赋值给原先的(覆盖原先的),使用方法与 operator+=、insert大同小异,只不过不是拼接字符串,而是覆盖。
replace也是替换,只不过是指定位置pos覆盖,assign 与 replace不同,assign是覆盖全部(赋值)不管原先和现在字符串的长度,replace是覆盖部分。
c_str可以将string类型转化成C语言的字符串数组类型,返回的是一个临时指针(不能操作该指针),指针指向字符串的第一个字符。
返回指定部分字符串的长度,从pos位置开始,长度为len,并会将这段字符串指针拷贝给s。
一、 find接口的 1、2、4用法差不多,都是从指定位置找相应的字符 / 字符串。
第一个是从string s0中找string s1,没有给出参数pos,默认为0,也就是从头开始找;返回找到的string类型字符串首元素下标 (类型size_t)
第二个是从string s0中找字符串" 789",给出参数pos = 1,从下标为1处开始找;返回找到的字符串首元素下标 (类型size_t)
第三个是从string s0中找字符 ' 0 ' ,给出参数pos = 5,从下标为5处开始找。返回找到的字符下标 (类型size_t)
二、
if (found!=std::string::npos)
这里find返回值返回的是size_t,而不是int,C语言通常下标返回都是int,如果找不到对应元素就返回负值(如-1),但是这里设计的找不到返回的是std::npos,不同平台下实现的具体值不一样。
测试:在VS 2019下为size_t 最大值:
三、find的第3个用法是从pos位置开始找字符串s的前n位,返回最先找到的下标。
四、rfind与find相对,是从后往前找。
该接口是去寻找与给出的字符串或string对象中匹配的字符,是最先出现匹配字符的分割字符串中第一个出现的匹配字符。
如果是循环进行的话,可以依次找出字符串中所有的匹配字符。
find_first_of / find_last_of 这些接口不怎么常用,需要的时候查阅即可。
比较string对象 / 字符串,返回值为int, ==0 则相等。
- std::string str1("green apple");
- std::string str2("red apple");
- //字符串str1与str2对比
- if (str1.compare(str2) != 0)
- std::cout << str1 << " is not " << str2 << '\n';
- //str1从下标6开始5个字符,与"apple"对比
- if (str1.compare(6, 5, "apple") == 0)
- std::cout << "still, " << str1 << " is an apple\n";
- //str2.size()-5下标处开始5个字符,与"apple"对比
- if (str2.compare(str2.size() - 5, 5, "apple") == 0)
- std::cout << "and " << str2 << " is also an apple\n";
- //str1下标6处开始5个字符,与str2下标4开始5个字符对比
- if (str1.compare(6, 5, str2, 4, 5) == 0)
- std::cout << "therefore, both are apples\n";
从指定位置开始拷贝,拷贝长度为len,如果len > 字符串剩余长度,则拷贝到结尾停止,返回string类型对象。
getline也属于流提取的一种,它可以输入带有空格的字符串以及带有空格的字符数组。
看一道OJ题了解一下:
- #include
- using namespace std;
-
- int main() {
- string s;
- getline(cin,s);
- int pos = s.rfind(' ');
- cout<
size()-pos-1< - }