1.string类
还记得我们数据结构学的串吗,现在在c++中,我们有了c++提供的标准库,它是一个写好的类,非常方便使用
1. string是表示字符串的字符串类
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
string;
4. 不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#include头文件以及using namespace std;
另外要提一嘴的就是,我们人类的语言与计算机的语言不一样,所以美国发明了ASCLL码表,这样计算机就能我们输入的东西是什么,记着就有各种的字符编码,有unicode,gbk等等,仅作了解。
2.string的常见接口说明
2.1string类对象的常见构造
void Test()
{
string s1;//空字符串
//string s2("hello ss");
string s2="hello ss";//涉及隐式类型转换 string(const char* s)
string s3(s2);//string(const string& s)
//
string s4(s2, 1, 5);//从pos位置开始拷贝len长度
string s5(s2, 2);//string(const string& s,size_t pos,size_t len=npos)
string s6(s2, 4);
string s7(5, '8');
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;
cout << s6 << endl;
cout << s7 << endl;
}
我们简单应用一下,这就是string的构造,值得一提的就是len=npos这个是什么意思呢,就是如果不给长度,就从pos的位置一直拷贝下去,因为它的类型是size_t,npos等于负一,所以是一个非常大的数默认拷贝到结束。
2.2
函数名称 功能说明
size(重点) 返回字符串有效字符长度
length 返回字符串有效字符长度
capacity 返回空间总大小
empty (重 检测字符串释放为空串,是返回true,否则返回false
clear (重 清空有效字符
reserve (重 为字符串预留空间**
resize (重 将有效字符的个数该成n个,多出的空间用字符c填充
前面都都比较简单,就是基本的类型,我们简单学习一下 reserve resize clear
reserve : 它的作用就是扩容,但是不能缩容。在vs平台下string 的容量是有一个15个的类似与数组的,所以一上来就是15个
resize:它的作用是类似于初始化一样,改变size为n,如果存储数据就不改变,没有存储就会以穿过的字符初始化
clear:就是清空字符串
3.string类对象的访问及遍历操作
string的遍历,一共有三种方式
第一种用的是类似于数组的[],在c++中进行了重载操作符。
const string s = "wanglina";
for (size_t i = 0; i < s.length(); i++)
{
cout << s[i] << " ";
}
第二种 迭代器,这个方法适合于所有的结构的遍历,栈,队列等等
string::const_iterator ss = s.begin();
while (ss != s.end())//这里要用地址比较,如果比较字符,会出现越界访问,并且可能提前结束
{
cout << *ss << " ";
ss++;
}
第三种 范围for遍历
for (auto e: s)
{
cout << e << " ";
}
//写范围for的话更推介写const auto &
for(const auto& e:s)
运行结果都是一样的;
我们这里这个迭代器的写法,可以用auto直接让编译器进行推算,但是我们学习要知道它的本质是什么
细心的观众已经发现,我有的写了const 有的string没写const,这是基于c++string的在迭代器实现分为有const和没有const两种,在使用的时候,调用哪个方便就调用哪个
iterator 可读可改
const_iterator 只读 相当于指针里的const int* 不能修改迭代器指向的内容,但是类似地址可以改否则没法遍历
const iterator 相当于int const *
4string类对象的修改操作
4.1+=
+= :串的+=就是两个字符串的合并在一起,这属于运算符的重载
insert:插入 字符串,strig类 字符等等
append:类似于尾插,不过尾插各种东西
如果尾插的话,不如用+=,很少用append
erase:从pos位置,删除len长的字符串
Swap: 交换两个字符串,全局里面也有一个swap,但是尽量用string里面的,因为全局的Swap会拷贝一个中间变量,然后像我们交换两个整数的那种写法一样,消耗巨大。
5对对象的操作
find: 寻找字符,stirng类 字符串都可以,返回下标。rind就是从末尾开始查找,返回查找到的第一个 位置。
substr:截取字符串,以string形式返回
利用算法库里的帮助我们实现sort功能
string s1 = "hello wanglina";
sort(s1.begin(),s1.end());
cout << s1 << endl;
太方便了是不是,记得引用算法头文件 algorithm
在数组中,我们可以通过[下标]访问数组内容,在c++中,string进行了运算符重载,[]也可以访问string,但是这个运算符重载,多了一项功能,就是帮助我们检查我们访问的下标大不大于我们的sz,就是字符串长度