简介
string是一个字符串类,可以像int一样定义,进行一些字符串的操作。
初始化及定义
//头文件
#include<string>
//1.
string str1; //生成空字符串
//2.
string str2("123456789"); //生成"1234456789"的复制品
//3.
string str3("12345", 0, 3);//结果为"123" ,从0位置开始,长度为3
//4.
string str4("123456", 5); //结果为"12345" ,长度为5
//5.
string str5(5, '2'); //结果为"22222" ,构造5个字符'2'连接而成的字符串
//6.
string str6(str2, 2); //结果为"3456789",截取第三个元素(2对应第三位)到最后
//7
string str7(str.begin() + 1, str.end()); //使用迭代器初始化
//8
string str4(ch_ptr, 3); //初始化为所指c字符数组的前n个字符
访问单个字符
string s = "xing ma qi!!!";
for(int i=0;i<s.size();i++)
{
cout<<s[i]<<" ";
}
return 0;
}
/*
x i n g m a q i ! ! !
*/
string数组
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s[10];
for(int i = 1; i < 10; i++)
{
s[i] = "loading... " ;
cout << s[i] << i << "\n";
}
return 0;
}
//输出
loading... 1
loading... 2
loading... 3
loading... 4
loading... 5
loading... 6
loading... 7
loading... 8
loading... 9
比较运算
string字符串支持常见的比较操作符(>,>=,<,<=,==,!=),支持string与C-string的比较(如 str < ”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按 字典顺序 进行逐一得 比较。字典排序靠前的字符小, 比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面) 同时,string (“aaaa”) <string(aaaaa)。
支持+运算符,代表拼接字符串
string s1;
string s2;
s1 = "123";
s2 = "456";
string s = s1 + s2;
cout<<s; //123456
读入字符串,遇空格,回车结束
string s;
cin>>s;
读入一行字符串(包括空格),遇回车结束
string s;
getline(cin,s);
getline(cin,s)会获取前一个输入的换行符,前一个输入回车后,回车并没有消失,会进入缓存区,需要在前面添加读取换行符的语句。如:getchar() 或 cin.get()
错误读取:
int n;
string s;
cin>>n;// 输入后回车,回车会进入缓冲区,被getline捕获到
getline(cin,s);//此时读取相当于读取了前一个回车字符
正确的读取方法
int n;
string s;
cin>>n;
getchar();//cin.get()
getline(cin,s);//可正确读入下一行的输入
cin输入完后,回车,cin遇到回车结束输入,但回车还在输入流中,cin并不会清除,导致getline()读取回车,结束。 (即上述注意点)需要在cin后面加cin.ignore();主动删除输入流中的换行符
cin和cout解锁
为什么要进行cin和cout的解锁呢,原因是:在一些题目中,读入的数据量很大,往往超过了1e5(105)的数据量,而cin和cout的读入输出的速度很慢(是因为cin和cout为了兼容C语言的读入输出在性能上做了妥协),远不如scanf和printf的速度,所以对cin和cout进行解锁使cin和cout的速度几乎接近scanf和printf,避免超时。
注意:cin cout解锁使用时,不能与 scanf 、getchar, printf,cin.getline( ) 混用,一定要注意,会出错。
string与C语言字符串(C-string)的区别
- string
是C++的一个类,专门实现字符串的相关操作。具有丰富的操作方法,数据类型为string,字符串结尾没有\0字符
- C-string
C语言中的字符串,用char数组实现,类型为const char *,字符串结尾以\0结尾
一般来说string向char数组转换会出现一些问题,所以为了能够实现转换,string有一个方法c_str()实现string向char数组的转换。
string s = "xing ma qi";
char s2[] = s.c_str();
接口函数
代码 | 含义 |
s.size()/s.length() | 返回string对象的字符个数,他们执行效果相同。 |
s.push_back()例:s.push_back(‘a’) | 末尾插入一个字符a |
s.insert(pos,element) 例:s.insert(s.begin() + 2,‘1’) | 在第3个位置s[2]插入字符'1' |
s.append(str)例:s.append(“abc”) str可以为string,cstr, | 在s字符串末尾添加字符串“abc” |
s.append(c,3); | 把c类型字符串s的前n个字符连接到当前字符串结尾 |
s1.append(s2, 5, 5) str1.append(str2.begin()+5, str2.end()); | 向string的后面加string的一部分 |
s.append(n,'i') | 在当前字符串结尾添加n个字符i |
erase(iterator it) | 删除字符串中it所指的字符 |
erase(iterator first, iterator last) | 删除字符串中迭代器区间[first,last)上所有字符 |
erase(pos, len) | 删除字符串中从索引位置pos开始的len个字符 |
clear()例:s.clear() | 删除字符串中所有字符,实质是把字符串空间首字符设置为了“\0” |
s.replace(pos,n,str) | 把当前字符串从索引pos开始的n个字符替换为str |
tolower(s[i]) | 转换为小写 |
toupper(s[i]) | 转换为大写 |
s.substr(pos,n) | 截取从pos索引开始的n个字符到s |
sort(s.begin(),s.end()) | 按ASCII码排序 |
大小写转换
通过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.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表示查找不到字符 |
#include<string>
#include<iostream>
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因为是从末尾开始查找,所以返回第一次找到的字符
}
查找替换
//字符串查找
int pos = str.find("na"); //没有该字符则返回s.npos(int)
cout << "position of na:\t\t" << pos << endl;
//字符串的替换
str1.replace(pos, 4, "naa"); //从表示从str1[pos]的下一个字符开始,将后面的4个字符替换为“naa”