『C++ Primer学习笔记』Chapter 3 string对象、vector对象以及数组的配套类型,C风格字符串问题和处理区别

string对象、vector对象以及数组(指针)配套的类型

无论是string对象还是vector对象,它们都有一个size()的成员函数,因此就可能会有这样的一个疑问:成员函数size()返回的到底是什么类型?之所以可能会有而不是一定会有是因为,当我们使用不同的方法处理这些对象时,我们可以使用(在range for或迭代器中)类型说明符auto或者(在下标法)类型指示符decltype来避免这个问题。

同样地,对于数组,我们也会有这样的一个疑问:使用不同方法处理时又各对应的是什么类型?因为一些方法(range for和标准库函数)可以使用类型说明符auto来避免,但是一些方法(下标法和指针)却又很有必要了解。

更进一步的,由于迭代器和指针可以进行算术运算,它们的差值返回的又是什么类型?

string对象

string对象(的成员函数size())配套的类型为:

string::size_type

很显然,它是一个无符号类型的值。

vector对象

vector对象(的成员函数size())配套的类型为:

vector<int>::size_type
vector<string>::size_type

很显然,它也是一个无符号类型的值。

迭代器

迭代器的类型为:

string::iterator
vector<int>::iterator
vector<string>::iterator

该类型可读元素亦可写元素。

string::const_iterator
vector<int>::const_iterator
vector<string>::const_iterator

该类型只能读元素不能写元素。

由于迭代器可以进行算术运算,因此它的差值的类型为

difference_type

很显然,该类型的值可正可负。

数组的下标

数组下标的类型为:

size_t

很显然,该类型的值不可为负。该类型变量常被初始化为常量表达式。

指针

由于指针可以进行算术运算,因此它的差值的类型为:

ptrdiff_t

知道以上不同对象的配套类型,我们就可以在知道其确切类型的情况下,灵活使用类型说明符auto或者类型指示符decltype

C风格字符串、字符数组以及string对象的区别和联系

C风格字符串:将字符串存放在字符数组中并以空字符('\0')结束。
字符数组:根据字符数组初始化方法的不同,将会产生不同的结果。

char a1[] = {'C','+','+'}; //列表初始化,没有空字符
char a2[] = {'C','+','+','\0'}; //列表初始化,含有显式的空字符
char a3[] = "C++"; //自动添加表示空字符结束的空字符
const char a4[6] = "Daniel"; //错误:没有空间存放空字符!

其中a1,a2为字符数组,a3C风格字符串。
string对象:即使初始化方法不同,都不包括空字符。

string s1("C++"); //直接初始化,不包括空字符
string s2 = "C++"; //拷贝初始化,除去最后的空字符其余的拷贝到s2中,因此也不包括空字符

C风格字符串、数组、string对象以及vector对象的处理方法区别

C风格字符串:C风格字符串只能使用定义在头文件cstring中的函数进行操作:长度、比较、连接和拷贝;

数组:只能使用下标法、标准库函数以及指针进行比较、连接等;不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。

string对象:可以直接进行比较和连接等操作;同时允许使用string对象初始化另外一个string对象,也可以相互赋值;

vector对象:可以直接进行比较操作;同时允许使用vector对象初始化另外一个vector对象,也可以相互赋值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值