🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
string的概念
string字符串是一种更加高级的封装,string字符串中包含了大量的方法,这些方法使得字符串的操作变得更加简单,string的使用,往往贯穿于整个蓝桥杯生涯中。
C++中将字符串直接作为一种类型,也就是string类型,使用string类型创建的对象就是C++的字符串。
使用C++中提供的string时,必须添加头文件<string>
string s1;string s2 = "abc";
string的常见操作
2.1创建字符串
#define _CRT_SECURE_NO_WARNINGS
#include<string> //添加string头文件
#include<iostream>
using namespace std;
int main()
{string s1;string s2 = "abc";cout << s1 << endl;cout << s2 << endl;return 0;
}
其中s1是空白字符串,s2是创建了abc的字符串。
- s1表示创建了一个空字符串,相当于创建整型int a,但未给a一个初始值。
- string s2表示创建一个字符串s2,它的内容是"hello world",要注意s2中的字符串不再以\0作为结束标志。
除了上面的创建字符串的写法外,还有其他一些创建字符串的方式。
string s("hello world");string s1 = s;//用一个现成的字符串s,初始化为另外一个字符串s1
当然C++中的string创建的字符串和char类型的数组所表示的字符串还有一个区别,string类型的字符串对象可以直接赋值。
#define _CRT_SECURE_NO_WARNINGS
#include<string> //添加string头文件
#include<iostream>
using namespace std;
int main()
{//string s1;//string s2 = "abc";//cout << s1 << endl;//cout << s2 << endl;string s("hello world");string s1 = s;//用一个现成的字符串s,初始化为另外一个字符串s1cout << s1 << endl;return 0;
}
cin的方式
可以直接使用cin给string类型的字符串输入一个字符串的数据。
int main()
{string s;cin >> s;cout << s << endl;return 0;
}
这个其实适用于不带空格的字符串,但如果输入的是带空格的字符串呢,我们来看看。
你看,这样子就不可以了。
那么,我们怎么可以读取空格呢?,解决的办法就是getline
getline
第一种getline函数以换行符("\n")作为字符串的结束标志,它的一般格式为:
getline(cin, string str);
这种形式的getline函数从输入流中读取文本,直到遇到换行符('\n')为止,然后将读取的文本(不包括换行符)存储到指定的string类型的变量str中。
#include<iostream>
#include<string>
using namespace std;
int main()
{string name;getline(cin,name);cout<<name<<endl;return 0;
}
第二种就是getlin函数允许用户自定义结束语法
#include<iostream>
#include<string>
using namespace std;
int main()
{
// string name;
// getline(cin,name);
// cout<<name<<endl;
//
// return 0; string name;getline(cin,name,'q');cout<<name<<endl;return 0;
}
你看,这样子就是以q作为了结束标志。
size()
string中提供了size()函数用于获取字符串长度。
string s;string s1="hello";string s2="hello world";string s3="12ab!= ";cout<<"s:"<<s.size()<<endl;cout<<"s1:"<<s1.size()<<endl; cout<<"s2:"<<s2.size()<<endl;cout<<"s3:"<<s3.size()<<endl;
接下来,我们用这个来遍历整个字符串
string s="abcdef";int i=0;for(i=0;i<s.size();i++){cout<<s[i]<<" ";}
注意string类型的字符串是可以通过下标来进行访问的。
迭代器
迭代器是一种对象,它可以用来遍历容器,迭代器的作用类似于指针,或者数组下标,这就意味着,如果我们想要访问迭代器所指向的值,我们需要解引用。
begin()
begin():返回指向字符串第一个字符的迭代器,需要一个迭代器的变量来接收
end()
end():返回指向字符串最后一个字符的下一个位置的迭代器(该位置不属于字符串)
迭代器是可以进行大小比较的,也可以进行+或者-整数运算的。
同一个容器的两个迭代器也可以相减,相减结果的绝对值,是两个迭代器中间元素的个数
string s="abcdef";string::iterator it1=s.begin();string::iterator it2=s.end();cout<<(it1<it2)<<endl;cout<<abs(it1-it2)<<endl;
正序遍历
string s="abcdef";for(auto it =s.begin();it!=s.end();it++){cout<<*it<<" ";}cout<<endl;for(string::iterator it=s.begin();it!=s.end();it++){cout<<*it<<" ";}
逆序遍历
string s="abcdef";for(auto it =s.end()-1;it!=s.begin()-1;it--){cout<<*it<<" ";}cout<<endl;for(string::iterator it=s.end()-1;it!=s.begin()-1;it--){cout<<*it<<" ";}
使用迭代器找到元素之后,改变迭代器指向的元素,是可以直接改变字符串内容的。
string str="abcdef";cout<<str<<endl;for(auto i=str.begin();i<str.end();i++){*i='X';}cout<<str<<endl;
push_back()
string s;s.push_back('h');s.push_back('e'); s.push_back('l');s.push_back('l');s.push_back('o');cout<<s<<endl;
字符串的+和+=操作
push_back()是用于在字符串后面添加一个字符,然而部分情况下我们需要向原有的字符串后继续添加字符串。
其实string类型的字符串是支持+和+=运算的,这里的本质是string中重载了operator+=这个操作符
我们来看下下面的例子:
string s="hello";s+="world";cout<<s<<endl;string s1="hello";cout<<s1+"world"<<endl;;s1=s1+="world";cout<<s1<<endl;string s2="hello";s2="world"+s2;cout<<s2<<endl;
pop_back()
pop_back()用于删除字符串尾部的一个字符,这个成员函数是在C++11标准中引入的,有的编译器可能不支持。
string s="hello";cout<<s<<endl;s.pop_back();cout<<s<<endl;s.pop_back();cout<<s<<endl;
当字符串中没有字符的时候,再调用pop_back(),是会发生报错的。
你看,devC++中直接崩溃了
insert
如果我们需要在字符串中间的某个位置插入一个字符串,这个时候我们就得掌握一个函数就是insert;
函数原型如下:
string& insert(size_t pos,const string& str);//pos前面插入一个string的字符串string& insert(size_t pos,const char*s);//pos前面插入一个C风格的字符串string& insert(size_t pos,size_t n,char c);//pos位置前面插入n个字符c
string s="abcdefghijk";string str="xxx";cout<<s<<endl;s.insert(3,str);cout<<s<<endl;const char*c="111"; s.insert(3,c);cout<<s<<endl;s.insert(3,3,'4');cout<<s<<endl;
find()
find()函数用于查找字符串中指定子串/字符,并返回子串/字符第一次出现的位置。
返回值
若找到,返回子串/字符在字符串中第一次出现的起始下标位置。
若未找到,返回npos
string s="hello world hello everyone";string str="llo";size_t n=s.find(str);cout<<n<<endl;n=s.find("llo");cout<<n<<endl;n=s.find("llo",n+1);cout<<n<<endl;
第二种用法
size_t n=s.find("word",0,3);//在s中,0这个指定位置开始查找“world中的前3个字符 cout<<n<<endl;n=s.find("everyone",n+1,5);
查找不到的情况
string s="hello world hello everyone"; string str="bit";size_t n=s.find(str);cout<<n<<endl;
substr()
substr()用于截取字符串中指定位置指定长度的子串
函数原型如下:
string substr(size_t pos =0,size_t len=npos) const;
string s="hello world hello everyone";string s1=s.substr(7);cout<<s1<<endl;string s2=s.substr(7,6);cout<<s2<<endl;
to_string
tostring函数可以将数字转换成字符串
string pi=to_string(3.14159);cout<<pi<<endl;
好了,今天的内容就到这里,我们明天再见。