string类的使用(上)
目录
1.string类的概念
2.string的构造函数(实现初始化)
3.对string类容量获取和操作
4.string类对象的访问和遍历
4.1operator[]
4.2begin和end
4.3 rbegin 和 rend
4.4迭代器分类
4.5范围for(自动实现++遍历)
5.string类对对象的修改和查找
5.1operator+=
5.2c_str
5.3npos和find
5.4 rfind
5.5substr
5.6 insert和erase
6.其他函数:
6.1operator+
6.2getline
6.3relational operator
1.string类的概念
上面是c++官方对string类的描述,我们不难发现string类的底层其实是:basic_string模版以char类型实例化出的结果。它实际上是以可动态增长的数组提供存储,并提供许多接口,实现多字符串的多种操作。
2.string的构造函数(实现初始化)
string类提供了多种构造函数。但我们在实际中多用到的是 默认构造函数,拷贝构造函数,以字符串构造函数。
string st1;//默认构造(重要
string st2("abcd");//带参构造(重要
string st3(st2);//拷贝构造(重要
string st4(st2, 2, 2);//子字符串构造(了解
string st5(st2, 3);//顺序构造(了解
string st6(4, 48);//填充构造(了解
string st7(st2.begin(), st2.begin() + 3);//范围构造(了解
3.对string类容量获取和操作
其中的size和length是同样的效果,capacity是返回空间容量, empty是判空.
clear是清空字符串(但是capacity不会变,只是size = 0)
reserve是申请改变容量(只有当n>capacity时,才会申请成功),当n<=capacity时都没有变化
resize:将字符串大小调整为 n 个字符的长度。如果 n 小于当前字符串长度,则当前值将缩短为其前 n 个字符,并删除第 n个字符以外的字符。如果 n 大于当前字符串长度,则通过在末尾插入所需数量的字符来扩展当前内容,以达到 n 的大小。如果指定了 c,则新元素将初始化为 c 的副本,否则,它们是值初始化字符(空字符)
4.string类对象的访问和遍历
4.1operator[]
string类已经完成了对[]的重载,我们用 name[pos]即可访问pos位置的字符
4.2begin和end
begin和end的返回参数需要用迭代器来接收,在string类里,迭代器(string::iterator)就像指针一样,但它不一定是指针。begin返回的首字符的指针,end返回的是末尾字符的后一个字符的指针。
我们用迭代器实现以下string的遍历
string::iterator it = s1.begin();
while (it != s1.end())
{
cout << *it << " ";
++it;
}
4.3 rbegin 和 rend
rbegin rend 与begin end类似,只不过他们的指向位置不同,正向方向不同
实现反向遍历
string s1("hello claus");
string::reverse_iterator it = s1.rbegin();
while (it != s1.rend())
{
cout << *it << " ";
++it;
}
4.4迭代器分类
4.5范围for(自动实现++遍历)
string s1("cada");
for (auto i : s1)
{
cout << i << " ";
}
5.string类对对象的修改和查找
5.1operator+=
operator+= 可以实现push_back(在string后加单字符)和append(是string后加字符串)的功能
5.2c_str
将string对象转换为c语言中的const char*格式,以便使用strcpy等针对字符串的函数
我们可以在这里区分下输出字符串和string的区别:
cout字符串的逻辑是输出到字符串的末尾\0,而cout<<string是把string类的所有输出,不管有没有\0.
5.3npos和find
npos是属于string类中的静态变量,使用string::npos,其代表的是size_t类型的-1,也就是size_t
的正向最大值。
find(char c,size_t pos = 0)是从pos位置找字符c或者字符串s出现的位置,如果找到就返回其位置出,找不到就返回npos。 其还有许多如下用法
5.4 rfind
rfind是从pos位置向前找字符c或者字符串s,返回位置,如果没找到就返回npos,其他用法如下
5.5substr
从string中的pos位置开始,截取n个字符,返回值
5.6例:分离URL中的协议,域名和资源名称
void trennen_url(const string& url)
{
size_t pos1 = url.find(':');
if (pos1 != string::npos)
{
cout << url.substr(0, pos1) << endl;
}
size_t pos2 = pos1 + 3;
size_t pos3 = url.find('/', pos2);
if (pos3 != string::npos)
{
cout << url.substr(pos2, pos3 - pos2) << endl;
cout << url.substr(pos3 + 1);
}
}
5.6 insert和erase
insert是向pos位置插入某个字符串或者string,所有用法如下(如果用迭代器是只能插入单字符且是正向)
erase 是从pos位置,删除n个长度
6.其他函数:
6.1operator+
operator+和operator+=的区别是前面的不会改变string,而后面的会改变string,但是他们的输出都是相同的。
6.2getline
当输入的string有space时,用scanf或者cin只能获取一部分,因为这两种遇到space或者换行就会停止输入,而getline只有换行时停止输入。一般的用法是getline(cin,str);其中cin是输入流
6.3relational operator
string还提供了互相比较大小的方法,其与c语言中的字符串比较大小相似,不做过多描述
扩展阅读:
ascii是一种值和字符的映射关系,0-255个值映射了许多字符。ascii是1个字符为一个编码
utf8和window gbk 是值和中文的映射关系。UTF-8使用1~4字节为每个字符编码,gabk为2字节为一个字符编码