本文共 4184 字,大约阅读时间需要 13 分钟。
可以把string理解为一个字符串类型,像int一样可以定义。
代码如下:
//头文件#include//初始化定义string str1; //生成空字符串 string str2("123456789"); //生成"1234456789"的复制品 string str3("12345", 0, 3);//结果为"123" string str4("123456", 5); //结果为"1234" ,长度string str5(5, '2'); //结果为"22222" ,几个相同字符形成串string str6(str2, 2); //结果为"3456789",第三个元素到最后
string s1;string s2;s1 = "123";s2 = "456";string s = s1 + s2;cout<
9.3.1 :读入字符串,遇空格,回车结束
string s;cin>>s;
9.3.2: 读入一行字符串(包括空格),遇回车结束
string s;getline(cin,s);
注意!!! getline(cin,s)会获取前一个输入的换行符,需要在前面添加读取换行符的语句。如:getchar() 或 cin.get()
错误读取:
int n;string s;cin>>n;getline(cin,s);//此时读取相当于读取了前一个回车字符
正确读取:
int n;string s;cin>>n;getchar();//cin.get()getline(cin,s);//可正确读入下一行的输入
9.3.3 cin>>与cin.getline()混用
cin输入完后,回车,cin遇到回车结束输入,但回车还在输入流中,cin并不会清除,导致getline()读取回车,结束。 (即上述注意点)
需要在cin后面加cin.ignore();主动删除输入流中的换行符9.3.4:cin和cout解锁
代码:
ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
为什么要进行cin和cout的解锁呢,原因是:
在一些题目中,读入的数据量很大,往往超过了1e5(105)的数据量,而cin和cout的读入输出的速度很慢,远不如scanf和printf的速度,具体原因可以搜索相关的博客进行了解。
所以对cin和cout进行解锁使cin和cout的速度几乎接近scanf和printf,避免超时。
注意!!!:cin cout解锁使用时,不能与 scanf 、getchar, printf,cin.getline( ) 混用,一定要注意,会出错。
获取字符串长度
代码 | 含义 |
---|---|
s.size()和length() | 返回string对象的字符个数,他们执行效果相同。 |
s.max_size() | 返回string对象最多包含的字符数,超出会抛出length_error异常 |
s.capacity() | 重新分配内存之前,string对象能包含的最大字符数 |
插入
代码 | 含义 |
---|---|
s.push_back() | 在末尾插入 |
例:s.push_back(‘a’) | 末尾插入一个字符a |
s.insert(pos,element) | 在pos位置插入element |
例:s.insert(s.begin(),‘1’) | 在第一个位置插入1字符 |
s.append(str) | 在s字符串结尾添加str字符串 |
例:s.append(“abc”) | 在s字符串末尾添加字符串“abc” |
删除
代码 | 含义 |
---|---|
erase(iterator p) | 删除字符串中p所指的字符 |
erase(iterator first, iterator last) | 删除字符串中迭代器区间[first,last)上所有字符 |
erase(pos, len) | 删除字符串中从索引位置pos开始的len个字符 |
clear() | 删除字符串中所有字符 |
例:s.clear() | 实质是把字符串空间首字符设置为了“\0” |
字符替换
代码 | 含义 |
---|---|
s.replace(pos,n,str) | 把当前字符串从索引pos开始的n个字符替换为str |
s.replace(pos,n,n1,c) | 把当前字符串从索引pos开始的n个字符替换为n1个字符c |
s.replace(it1,it2,str) | 把当前字符串[it1,it2)区间替换为str it1 ,it2为迭代器哦 |
大小写转换
法一:
代码 | 含义 |
---|---|
tolower(s[i]) | 转换为小写 |
toupper(s[i]) | 转换为大写 |
法二:
通过stl的transform算法配合tolower 和toupper 实现。
有4个参数,前2个指定要转换的容器的起止范围,第3个参数是结果存放容器的起始位置,第4个参数是一元运算。string s;transform(s.begin(),s.end(),s.begin(),::tolower);//转换小写transform(s.begin(),s.end(),s.begin(),::toupper);//转换大写
分割
代码 | 含义 |
---|---|
s.substr(pos,n) | 截取从pos索引开始的n个字符 |
查找
代码 | 含义 |
---|---|
s.find (str, pos) | 在当前字符串的pos索引位置(默认为0)开始,查找子串str,返回找到的位置索引,-1表示查找不到子串 |
s.find (c, pos) | 在当前字符串的pos索引位置(默认为0)开始,查找字符c,返回找到的位置索引,-1表示查找不到字符 |
s.rfind (str, pos) | 在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,-1表示查找不到子串 |
s.rfind (c,pos) | 在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符 |
s.find_first_of (str, pos) | 在当前字符串的pos索引位置(默认为0)开始,查找子串s的字符,返回找到的位置索引,-1表示查找不到字符 |
s.find_first_not_of (str,pos) | 在当前字符串的pos索引位置(默认为0)开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符 |
s.find_last_of(str, pos) | 在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符 |
s.find_last_not_of ( str, pos) | 在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串 |
还是不会用? 下面上代码,进行实操
#include#include int main(){ string s("dog bird chicken bird cat");//字符串查找-----找到后返回首字母在字符串中的下标// 1. 查找一个字符串 cout << s.find("chicken") << endl;// 结果是:9 // 2. 从下标为6开始找字符'i',返回找到的第一个i的下标 cout << s.find('i',6) << endl;// 结果是:11 // 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标 cout << s.rfind("chicken") << endl;// 结果是:9 // 4. 从字符串的末尾开始查找字符 cout << s.rfind('i') << endl;// 结果是:18因为是从末尾开始查找,所以返回第一次找到的字符 // 5. 在该字符串中查找第一个属于字符串s的字符 cout << s.find_first_of("13br98") << endl;// 结果是:4---b // 6. 在该字符串中查找第一个不属于字符串s的字符------先匹配dog,然后bird匹配不到,所以打印4 cout << s.find_first_not_of("hello dog 2006") << endl; // 结果是:4 cout << s.find_first_not_of("dog bird 2006") << endl; // 结果是:9 // 7. 在该字符串最后中查找第一个属于字符串s的字符 cout << s.find_last_of("13r98") << endl;// 结果是:19// 8. 在该字符串最后中查找第一个不属于字符串s的字符------先匹配t--a---c,然后空格匹配不到,所以打印21 cout << s.find_last_not_of("teac") << endl;// 结果是:21}
排序
sort(s.begin(),s.end()); //按ASCII码排序
转载地址:http://hjrq.baihongyu.com/