- Stl
- Stl的六大组件
- string类
- string类的构成
- string的底层原理
- 迭代器
- 常用构造函数接口
- 常用成员函数接口
- insert
- erase
- find和rfind
- getline
- 子串substr
- string的两种扩容函数
- 字符串的几种访问方式
- +=
Stl的六大组件STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
(
1
)
(1)
(1)算法
(
2
)
(2)
(2)容器
(
3
)
(3)
(3)迭代器
(
4
)
(4)
(4)空间适配器
(
5
)
(5)
(5)仿函数
(
6
)
(6)
(6)配接器
目前我们对stl有个了解就好,在后面的学习中我们会逐步加深对其的理解。
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
string类头文件
#include
string类的构成string属于C++stl库中的一个类,其是basic_string 通过typedef出来的。
string类下含有6个构造函数以及很多的成员函数,接下来我们重点讲解其中常用的函数接口
用的时候别忘了包string的头文件
string的类的成员大致由如下组成:
class string
{
private:
char _Buf[16];//(1)
char* _ptr;//(2)
size_t _mysize;//(3)
size_t _myres;//(4)
};
(
1
)
(1)
(1)在string中,当字符串长度小于15的时候就会存在string类下的原生数组中。
(
2
)
(2)
(2)当字符串长度大于等于16以后,string就会去堆上申请空间,使用_ptr去接收,并且在字符串存储在里面
(
3
)
(3)
(3)字符串当前的字符个数
(
4
)
(4)
(4)字符串容量。
string的底层是一个类模板:
template<class T>
class basic_string
{
//函数接口....
public:
T *str;
//....
};
这里大家可能会好奇,为什么string的类模板是T类型的,string里存储的不都是char类型的字符吗?
在计算机中,程序都是以二进制进行存储的,不同的二进制数字就能代码不同的情况。
而英文中的字符则是以ascill码的形式对应相应的数字,不同的数字对应不同的二进制,因此对于英文只需要一个字节就能存储26个字母对应的ascill码,也就能存储所有的单词组合。
但是计算机是一种全球化的产物,除了需要存储英文,还需要存储中文,日文…。这些语言的组成比较复杂,文字数量庞大,一个字节无法存储下所有情况,所以这些语言大多用两个字节进行存储。
所以有了wchar_t这种可以2个字节的类型。
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
迭代器名称:Iterator
迭代器我们暂时将其看作是一个类似指针的东西,关于迭代器的具体底层原理,在后面我们会详细说明。
迭代器可以用来间接遍历容器,如我们今天的string类。
在C++中,提供了正向迭代器和反向迭代器
正向迭代器含有两个成员函数:
迭代器的统一使用格式:
容器类型::迭代器名称 =成员函数
迭代器该如何使用呢?
string s1("hello world");
string::iterator it = s1.begin();
while (it != s1.end())
{
cout << *it;
it++;
}
通过迭代器指向字符串的第一个字符
逐步自增直到走到字符串的\0位置。
反向迭代器
string s1("hello world");
string::reverse_iterator it = s1.rbegin();
while (it != s1.rend())
{
cout << *it;
it++;
}
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
常用构造函数接口 常用成员函数接口
ps:size和capacity的区别
size
是字符串所能容纳的字符空间。
capacity
:系统为字符串分配空间的时候,会多分配一些空间,假设申请100
的空间,但是系统可能会分配120
,这时size
就是100
,capacity
就是120
。可以将多出来的那部分看作是备用空间,但是并不是你一定能够使用的。
ps::append有多种重载版本,append同样也可以在字符串末尾加入n个字符,但是我们必须指明是几个字符,如s.append(1,‘a’);//在s字符串末尾加入一个a。
-----------------------------------我是分割线---------------------------------------------
insert
(
1
)
(1)
(1)insert插入函数
insert可以指定在字符串的某个位置插入字符或者字符串
我们重点讲两种:
(
1
)
(1)
(1)在指定位置插入字符串。
参数一
:插入的位置
参数二
:插入的字符串
s1.insert(1,"adc");
(
2
)
(2)
(2)在指定位置插入n个字符串:
参数一
:插入的位置
参数二
:插入的字符个数
参数三
:要插入的字符
s1.insert(2,5,'c');
除了通过字符下标进行指定位置,还能通过迭代器:
如
s1.insert(s.begin(),'a');
s1.insert(s.begin(),5,'a');
迭代器的insert
重载版本可以不指定插入的字符个数,默认为1。
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
erase
(
1
)
(1)
(1)erase删除函数
共三种版本:
(
1
)
(1)
(1)指定位置向后删除n个字符。
如果没指定,则会使用默认值npos
,npos
是一个很大的数字,所以如果没有说明删除几个字符,则默认出该位置开始删除直到字符串末尾。
string s1("helloc");
string s2("helloc");
s1.erase(1);//没指明删除的字符个数,默认用npos
cout << s1 << endl;
s2.erase(1,5);
(
2
)
(2)
(2)传入迭代器
默认删除迭代器位置的一个字符
string s1("helloc");
s1.erase(++s1.begin());
也可以指定从迭代器的一个位置开始,另一个位置结束
string s1("helloc");
s1.erase(s1.begin(),s1.end());
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
find和rfind
(
1
)
(1)
(1)find正向查找函数
find
函数有两个参数,其既可以查找字符,也可以查找字符串。其返回值为查找位置开始第一次查找的到字符串/字符的位置,没找到即返回npos
。
参数一:
要查找的字符或者字符串
参数二:
开始查找的位置(缺省值:默认为0)
string s1("helloc");
cout << s1.find('c');
cout << s1.find('lo,3');
(
1
)
(1)
(1)rfind反向查找函数
功能和find基本一致,但是是从字符串末尾位置开始向前找字符
返回该字符从后向前找第一个找到的位置。如下面的o的位置就是5。
这个返回位置依旧是按照数据下标0开始计算的。
string s1("helloc");
cout << s1.rfind("lo");
cout << s1.find('o');
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
getlinecin
在读取字符串的时候,遇到空格或者回车就会停止读入:
对于"hello world"
;形式的就无法读入,这时可以使用getline
函数
getline
遇到回车才会停止读入
getline(cin,字符串名字);
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
子串substr功能:获取字符字符串的子串,其返回类型是string
两个参数
参数一:
字串开始的位置(缺省值为0
)
参数二:
字串结束的位置(缺省值为npos
,如果没写则默认执行到字符串末尾)
int main()
{
string s1("hello");
string s2 = s1.substr(1);
string s3 = s1.substr(2, 3);
cout << s2 << endl;
cout << s3 << endl;
}
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
string的两种扩容函数
(
1
)
(1)
(1)resize(size_t n;char c='.')
s1resize(100,'n');n
为当前字符串扩容n
个字节的空间,并将字符串有效字符个数增加到c
,不够的部分用字符'
(
2
)
(2)
'
进行填充。(没写第二个参数就默认填充);
当resize申请的容量小于当前容量时,其多出来的部门会被舍去。但是其容量不会缩小。
(2)reserve (size_t n = 0);
1.下标索引----[]
char
为当前字符串扩容n个字节的空间,但是不会为新开的空间进行初始化。
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
字符串的几种访问方式&
[ ] operator(size_t)return pos[
{
] _str;pos}string
[]
2.at
类重载了at
函数,每次访问该字符串的某个位置,返回的都是该位置的引用,因此我们既可以读字符串的某个位置,还可以对该位置进行修改。
[]
s1是C++以前的产物了,其也能对字符串进行读写 *** 作,与(类似
string "helloc");.at
s1(0)='a' ;//将字符串0位置的字符修改为'a'at和[]的区别
[]:
s1
检查越界的方式不一样:
(断言
string "helloc");<<[
cout 20 s1];at
(
1
)
(1)
:抛异常
------------------------------------------------------------我是分割线💥💥💥💥💥💥💥💥💥💥------------------------------------------------------
+=string类重载了+=运算符。
(1)+=字符
intmain
( );+=
{
string s1'a'
s1 ; <<<<
cout ; s1 } endl
(
2
)
(2)
(2)+=字符串
intmain
( );+=
{
string s1"hello"
s1 ; <<<<
cout ; s1 } endl
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)