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
为字符数组,a3
为C风格字符串。
string
对象:即使初始化方法不同,都不包括空字符。
string s1("C++"); //直接初始化,不包括空字符
string s2 = "C++"; //拷贝初始化,除去最后的空字符其余的拷贝到s2中,因此也不包括空字符
C风格字符串、数组、string对象以及vector对象的处理方法区别
C风格字符串:C风格字符串只能使用定义在头文件cstring
中的函数进行操作:长度、比较、连接和拷贝;
数组:只能使用下标法、标准库函数以及指针进行比较、连接等;不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。
string
对象:可以直接进行比较和连接等操作;同时允许使用string
对象初始化另外一个string
对象,也可以相互赋值;
vector
对象:可以直接进行比较操作;同时允许使用vector
对象初始化另外一个vector
对象,也可以相互赋值;