【C++ Primer】【学习笔记】【第三章】标准库类型之:vector类型

标准库vector类型

vector称为容器,因为它可以包含其他对象,一个容器中的所有对象都必须是同一种类型的。
vector不是一种数据类型,而是一个类模板,可用来定义任意多种数据类型。如:vector、vector都是数据类型。
对于size_type类型,写法vector::size_type是错误的,必须写成vector::size_type。

1、几种初始化vector对象的方式如下:
方式
含义
vector v1;
vector保存类型为T的对象,默认构造函数v1为空。
vector v2(v1);
v2是v1的一个副本。
vector v3(n, i);
v3包含n个值为i的元素。
vector v4(n);
v4含有n个相同值的元素,元素的值根据T来确定。如果T为int则值为0;如果T为string则值为""。

2、vector对象的操作
操作
含义
v.empty()
判断v是否为空,是则返回true,否则返回false
v.size()
返回v中元素的个数;该函数的返回类型为 vector::size_type,为一个无符号数,至于是unsigned int还是unsigned long由机器决定。
v.push_back(t)
在v的末尾增加一个值为t的元素。
v[n]
返回v中位置为n的字符,位置从0开始计数。这里的下标n的类型最好也使用 string::size_type
s1 + s2
s1 + "string"
将s1和s2连接成一个新的字符串,并返回新生成的字符串。
字符串进行连接时,+操作符的左右操作数必须至少有一个是string类型的(即:两个字符串字面值相加是非法的),并且+操作返回一个新的string对象。
s1 = s2
把s1的内容替换成s2的副本
s1 == s2
比较s1和s2的内容,相等则返回true,不等则返回false。这里相等的含义是:长度相同,并且含有相同的字符。
!=, >, >=, <, <=
保持惯有含义,参考 ==

迭代器简介

迭代器是一种检查容器内元素并遍历元素的数据类型。
标准库为每一种标准容器(包括vector)都定义了一种迭代器类型,迭代器类型提供了比下标操作更通用化的方法,即:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。C++程序更倾向于推荐使用迭代器而不是下标操作。

1、容器的iterator类型
每种容器类型都定义了自己的迭代器类型,比如:vector迭代器类型表示为:
vector::iterator iter;
其中,vector::iterator为迭代器类型,iter为由迭代器类型定义的迭代器。

2、begin和end操作
每种容器都定义了begin函数和end函数,这两个函数均返回迭代器。如果容器为空,则begin返回的迭代器和end返回的迭代器相同;如果容器不为空,则begin返回的迭代器指向容器的第一个元素,end返回的迭代器指向容器的最后一个元素的下一个元素,此时,end返回的迭代器也被称为超出末端迭代器。

3、迭代器的算术操作
格式
支持情况
iter + n
支持
iter - n
支持
iter1 - iter2
支持,用于计算两个迭代器对象的距离,结果类型为difference_type,是signed类型的值
iter1 + iter2
不支持
正确: vector::iterator mid = ivec.begin() + ivec.size() / 2;
错误: vector::iterator mid = (ivec.begin() + ivec.end()) / 2;

4、容器的const_iterator类型
与容器的iterator类型对应,const_iterator类型表示只能用于读取容器内元素,但是不能改变其值。即:当对const_iterator类型解引用时,得到的是一个指向const对象的引用。

例如:对于 vector::const_iterator iter; 迭代器iter本身的值是可以改变的,但其指向的元素是不能改变的。对应C语言,就好像是定义:const int *iter;

4、const_iterator对象与const的iterator对象之间的区别
类别
说明
const_iterator对象
vector::const_iterator iter;
好比C语言中的:
const int *iter; 或 
int const *iter;
const的iterator对象
vector nums(10);
const vector::itreator cit = num.begin();
好比C语言中的:
int nums[10];
int * const cit = &num[0];

5、容器本身可以是const的或者是非const的,对应写法如下:
vector numbers(10, 9);               // 非const的容器
const vector numbers(10, 9);     // const的容器
对于非const的容器,可以使用vector::iterator定义的迭代器进行访问,也可以使用vector::const_iterator定义的迭代器进行访问。
对于const的容器,则只能使用 vector::const_iterator定义的迭代器进行访问。

你可能感兴趣的:(C++)