string类
简介
string是c++中的一级成员,纯c中没有,使用时需要用到头文件#include
string的定义及初始化
string str;//生成空字符串
string s(str);//生成字符串为str的复制品
string s(str,str_begin,str_len);//将字符串str中从下标str_begin开始、长度为str_len的部分作为字符串初值
string s(str,c_len);//以str的前c_len个字符串作为字符串s的初值
string s(num,c);//生成num个c字符的字符串
string s(str,str_idx);//将字符串str中从下标str_idx开始到字符串结束的位置作为字符串初值
EG:
string s0;//生成空字符串
string s1="hello";//初始化一
string s1("world");//初始化二
string s2(s1,2,3);//s2="llo";从s1的2位置的字符开始,连续3个字符赋值给s5
string s3(s1,1);//s3="ello";从s1的2位置的字符开始,将后续的字符都赋值给s6
string s4(5,'a');//s4="aaaaa";
string的读入
string 类支持 cin 方式和 getline() 方式两种输入方式。简单示例如下:
string s;
cin>>s;//不能读空格,遇到空白字符即停止读入
getline(cin,s);//可以读空格,读取一整行的内容
string的大小和容量
s.size()和s.length()返回string对象的字符个数。
s.max_size()返回string对象最多包含的字符数。
string的比较
1、支持 ==、>=、<=、!=、>、<等比较运算符
2、s.compare();
string a("aa");
string b("bb");
string c("bb");
a.compare(b)-> -1
b.compare(a)-> 1
b.compare(c)-> 0
string的插入
1、push_back();
2、insert();
string s;
//尾插一个字符
s.push_back('a');
s.push_back('b');
s.push_back('c');
//s: abc
//insert(pos,char);在指定的位置pos前插入字符char
string s1 = "hello";
s1.insert(1,"ins"); //从s1的1位置开始,插入"ins"字符串,即s1="hinsello";
s1.insert(1, "ins", 2);//从s1的1位置开始,插入"ins"字符串的前2个字符,即s1="hinello";
s1.insert(1, "ins", 1, 2);//从s1的1位置开始,插入"ins"字符串的从1位置开始的2个字符,即s1="hnsello";
string拼接字符串
1、append();
2、’+’’;
string s("abc");
s.append("def");
//s: abcdef
string s1="abc";
string s2="def";
s1=s1+s2;//'='右边至少有一个string类型的对象
//s1: abcdef
string的遍历
1、借助迭代器
2、下标法
string s("abcdef");
//下标法
/*
s[0]:'a'
s[1]:'b'
s[2]:'c'
s[3]:'d'
s[4]:'e'
s[5]:'f'
*/
//正向迭代器
string::iterator iter=s.begin();
for(;iter<s.end();iter++)
{
cout<<*iter;
}
cout<<endl;
//反向迭代器
string::reverse_iterator riter=s.rbegin();
for(;riter<s.rend();riter++)
{
cout<<*riter;
}
cout<<endl;
string的删除
1. iterator erase(iterator p);//删除字符串中p所指的字符
2. iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符
3. string& erase(size_t pos=0, size_t len=npos);//删除字符串中从索引位置pos开始的len个字符
4. void clear();//删除字符串中所有字符
string s1 = "123456789";
s1.erase(s1.begin()+1); // 结果:13456789
s1.erase(s1.begin()+1,s1.end()-2); // 结果:189
s1.erase(1,6); // 结果:189
string::iterator iter = s1.begin();
while(iter!=s1.end())
{
cout<<*iter;
*iter++;
}
cout<<endl;
string的字符替换
1. string& replace(size_t pos, size_t n, const char *s);//将当前字符串从pos索引开始的n个字符,替换成字符串s
2. string& replace(size_t pos, size_t n, size_t n1, char c); //将当前字符串从pos索引开始的n个字符,替换成n1个字符c
3. string& replace(iterator i1, iterator i2, const char* s);//将当前字符串[i1,i2)区间中的字符串替换为字符串s
string s1("hello,world!");
cout<<s1.size()<<endl; // 结果:12
s1.replace(s1.size()-1,1,1,'.'); // 结果:hello,world.
// 这里的6表示下标 5表示长度
s1.replace(6,5,"girl"); // 结果:hello,girl.
// s1.begin(),s1.begin()+5 是左闭右开区间
s1.replace(s1.begin(),s1.begin()+5,"boy"); // 结果:boy,girl.
cout<<s1<<endl;
string的查找
1. size_t find (constchar* s, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找子串s,返回找到的位置索引,-1表示查找不到子串
2. size_t find (charc, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找字符c,返回找到的位置索引,-1表示查找不到字符
3. size_t rfind (constchar* s, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,-1表示查找不到子串
4. size_t rfind (charc, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符
5. size_tfind_first_of (const char* s, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找子串s的字符,返回找到的位置索引,-1表示查找不到字符
6. size_tfind_first_not_of (const char* s, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符
7. size_t find_last_of(const char* s, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符
8. size_tfind_last_not_of (const char* s, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串
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
string的排序
sort(s.begin(),s.end())
string s("acdebf");
sort(s.begin(),s.end());
cout<<s<<endl;//s:"abcdef"
刷题遇到的
std::reverse()
,顾名思义,用于反转序列。需要提供首尾迭代器作为参数。std::string::erase()
,传入两个迭代器 l,r,清除[l,r)范围内的字符。std::string::substr()
,用于提取子字符串,用法与前者类似。std::string::find()
,用来查找字串在母串中第一次出现的位置。