C++ string的使用

前言

在PAT中的一二题中经常出现字符处理的题目,如果对string熟悉的话,其实难度就不大了,这里再复习一遍。

定义

1
2
3
4
5
#include <string>
using namespace std;

string str;
string str1, str2;

【STAR】倒序遍历

使用倒序迭代器函数rbegin()和rend()

1
2
3
for(auto riter = str.rbegin(); riter != str.rend(); riter++) {
cout << *riter;
}

【STAR】获得字符长度

使用size()成员方法或者length()成员函数

1
2
cout << str.size();
cout << str.length();

之所以有两个是历史原因,两个都返回字节数(bytes)。

改变string的容量

使用resize()成员方法

1
2
3
4
5
str.resize(n);
str.resize(n, '+');
// n是目标大小
// 如果string本身的长度小于n,则会从第一个开始到第n个(带到长度n)被保留下来,剩余的则会被切除
// 如果stirng本身的长度大于n,则会在原来string的基础上在后面添加空的位置直到达到长度n,如果指定了字符,则多的位置全部初始化为该字符

将string变成空字符串

使用clear()成员方法

1
str.clear();

【STAR】判断string是不是空字符串

使用empty()成员方法

1
bool isEmpty = str.empty();

访问特定位置的字符,并可以修改

使用[]或者at()方法,都接受从0到length() - 1的size_t类型索引参数,结果是引用类型。如果string是const修饰,则是常量引用,则不可以修改。

1
2
cout << str[0];
cout << str.at(0);

访问开头和结尾的字符,并可以修改

使用front()和back()成员方法分别获得string的首个字符的引用和最后一个字符的引用,但是不能对空字符串使用。

1
2
cout << str.front();
cout << str.back();

【STAR】字符串尾部拼接

使用+=运算符(3个重载运算)

1
2
3
str += "K";    //C风格的显式字符串
str += str1; //string拼接到string
str += '\n'; //直接拼接字符

使用append()成员方法(6个重载方法)

1
2
3
4
5
6
7
8
str.append(str2);    //string拼接string
str.append(str2, 6, 3); //拼接另一个string的子串,C++里的范围一般是第一个参数指定开始位置,而第二个参数指定长度
str.append("Nice to see you", 5); //拼接C风格字符串同时指定前多少个
str.append("Nice to see you"); //或者全部拼接一个C字符串
str.append(10u, '0'); //指定拼接某个数量的字符
str.append(str2.begin() + 8, str2.end()); //指定拼接串的迭代器范围

str.append<int>(10, 0x2D); //本质上和指定数目拼接字符相同

使用push_back()成员方法将字符拼接到string末尾

1
str.push_back('c');

给字符串赋值(覆盖原值)

使用=运算符或者assign()成员方法(6个重载方法)

1
2
3
4
5
6
7
8
str.assign(str1);    //完整赋值
str.assign(str1, 10, 6); //指定开始位置和长度部分赋值
str.assign("Are you kidding?", 6); //C字符串以及指定从头开始的长度
str.assign("Maybe"); //C字符串的完整赋值
str.assign(10, '*'); //指定数目的字符赋值
str.assign(str1.begin(), str1.end() - 1); //指定范围迭代器赋值

str.assign<int>(10, 0x2D); //本质上和指定数目拼接字符相同

这套重载和拼接是一样的

插入字符串

使用insert()成员方法

擦除部分字符串(会减少长度)

使用erase()成员方法

替换字符串

使用replace()成员方法(实际上就是erase()和insert()的结合效果)

交换两个string的内容

使用swap()成员方法

删除最后一个字符

使用pop_back()成员方法

转换成C字符串

使用c_str()成员方法,返回一个字符串指针

【STAR】查找string的子列

使用find()成员函数(4个重载)
返回子串中第一个字符第一次出现的位置,类型是size_t
如果没有找到就返回string\::npos
rfind()成员函数则是返回最后一个匹配的子串的第一个字符的位置

1
2
3
4
size_t found = str.find(str1);
size_t found = str.find("What a good day", 2, 6); //指定范围
size_t found = str.find("Hi");
size_t found = str.find('h'); //字符

【STAR】获得string的子列

使用substr()成员方法
提供开始位置的参数,子串长度的参数

1
2
string subs1 = str.substr(2, 4);
string subs2 = str.substr(2); //从2到结尾

比较字符串

使用compare()成员变量
提供6个重载

1
2
3
4
5
6
7
8
9
10
if(str.compare(str1) == 0) {
//They are equal
}
if(str.compare(6, 5, str1) == 0) {
//str位置6开始长度为5的子串和str1相比
}
if(str.compare(str.size() - 5, 5, str1) {
//str最后五个字符与str1相比
}
// 可以抽象理解为str - str1

如果返回结果等于零,则两个字符串相等
返回结果小于零,则说明参数里要匹配的字符串第一个不匹配的字符值要更大,或者全部匹配了,但是这个字符串比调用这个方法的字符串要长。
返回结果大于零,说明参数里要匹配的字符串第一个不匹配的字符值要更小,或者全部匹配了,但是这个字符串要更短。

字符流读入

使用string\::getline()类方法
第一个参数是一个流,第二个参数是保存的string,如果指定了第三个参数一个字符,就在出现这个字符的时候停止输入,没有就直到遇到换行符。(第三个参数或者换行符会被读取但是被丢弃)

【STAR】字符串转int

使用stoi()类方法
第一个参数是要转换的string;第二个参数是一个指针,这指针是指向一个size_t类型的变量,也可以指定为nullptr不用,用了就会将那个值设置为要转换的string的数字部分的之后第一个位置;第三个参数是指定进制,默认是10,如果指定为0,则会根据stirng的格式判断该转化为什么进制。

各类string转其他数值类型

转单浮点stof(),双浮点stod()

【STAR】数值类型转string

使用to_string()类方法

总结

关于方法参数,C++里面的哲学是一致的,主要有:

  1. 指定一定数目重复的值,则有两个参数,前者是_数量,后者是具体值_。
  2. 关于C字符串如果指定长度,则是从开头位置开始到那个_长度_为止。
  3. 对于通过位置数值截取容器对象,则第一个参数一般是开始位置,第二个参数是截取长度
  4. 迭代器则是开始迭代器尾后迭代器确定范围。
    几个一定要记住并熟练掌握的成员方法:
  5. 倒序迭代器rbegin()和rend()
  6. 获取字符串长度length()或者size()
  7. 使用+=或者append()拼接字符串
  8. 使用find()查找子列是否存在
  9. 使用substr()获得子列
    然后是一些类方法:
  10. 使用stoi()类方法将string变为int
  11. 使用to_string()类方法将数值类型转为string