string 的完整介绍

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:就是清空字符串

注意:
1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一
致,一般情况下基本都是用size()。
2. clear()只是将string中有效字符清空,不改变底层空间大小。
3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字
符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的
元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大
小,如果是将元素个数减少,底层空间总大小不变。
4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
string的底层空间总大小时,reserver不会改变容量大小。

 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,就是字符串长度 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值