标准库 vector 类型

来源:互联网 发布:python高级编程 微盘 编辑:程序博客网 时间:2024/06/02 09:48

标准库 vector 类型

vector 不是一种数据类型,而只是一个类模板(class template),可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型。因此,vector 和 vector 都是数据类型。

初始化vector

这里写图片描述

值初始化

如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化(value initializationd)。这个由库生成的初始值将用来初始化容器中的每个元素,具体值为何,取决于存储在 vector 中元素的数据类型。
如果 vector 保存内置类型(如 int 类型)的元素,那么标准库将用 0 值
创建元素初始化式:
vector fvec(10); // 10 elements, each initialized to 0
如果 vector 保存的是含有构造函数的类类型(如 string)的元素,标准
库将用该类型的默认构造函数创建元素初始化式:
vector svec(10); // 10 elements, each an empty string
还有第三种可能性:元素类型可能是没有定义任何构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。

用数组初始化vector

const size_t arr_size = 6;int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};// ivec has 6 elements: each a copy of the corresponding elementin int_arrvector<int> ivec(int_arr, int_arr + arr_size);

vector常用操作

这里写图片描述

安全的泛型编程

for (vector<int>::size_type ix = 0; ix != 10; ++ix)    ivec.push_back(ix); // ok: adds new element with value ix

调用 size 成员函数而不保存它返回的值,在这个例子中同样不是必需的,但这反映了一种良好的编程习惯。在 C++ 中,有些数据结构(如vector)可以动态增长。上例中循环仅需要读取元素,而不需要增加新的元素。但是,循环可以容易地增加新元素,如果确实增加了新元素的话,那么测试已保存的 size 值作为循环的结束条件就会有问题,因为没有将新加入的元素计算在内。所以我们倾向于在每次循环中测试 size的当前值,而不是在进入循环前,存储 size 值的副本。
我们将在第七章学习到,C++ 中有些函数可以声明为内联(inline)函数。编译器遇到内联函数时就会直接扩展相应代码,而不是进行实际的函数调用。像 size 这样的小库函数几乎都定义为内联函数,所以每次循环过程中调用它的运行时代价是比较小的。

迭代器简介

标准库为每一种标准容器(包括 vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。

vector 迭代器的自增和解引用运算

迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:
*iter = 0;
迭代器使用自增操作符(1.4.1 节)向前移动迭代器指向容器中下一个元素。
由于 end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。

const_iterator

每种容器类型还定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。
当我们对普通 iterator 类型解引用时,得到对某个元素的非 const(2.5 节)。而如果我们对 const_iterator 类型解引用时,则可以得到一个指向 const 对象的引用(2.4 节),如同任何常量一样,该对象不能进行重写。
使用 const_iterator 类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值。

迭代器的算术操作

迭代器算术操作
(iterator arithmetic),包括:
• iter + n
• iter - n
加上或减去的值的类型应该是 vector 的 size_type 或 difference_type 类型(参考下面的解释)。
• iter1 - iter2
该表达式用来计算两个迭代器对象的距离,该距离是名为 difference_type 的 signed 类型 size_type 的值,这里的 difference_type 是 signed 类型,因为减法运算可能产生负数的结果。该类型可以保证足够大以存储任何两个迭代器对象间的距离。

任何改变 vector 长度的操作都会使已存在的迭代器失效。例如,在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了。

0 0
原创粉丝点击