详解详解C++中的中的vector容器及用迭代器访问容器及用迭代器访问vector的方法的方法
vector
vector是相同类型对象的集合。集合中的每个对象有个对应的索引。vector常被称为容器(container)。
为了使用vector,需要:
#include <vector>
using std::vector;
vector是一个类模版(class template)。C++有函数模版和类模版。模版本身不是函数或类,必须通过指定 类型让编译器去实例
化(instantiation)它。比如vector<int> ivec。
vector是模版,不是类型。从vector得到的类型要包含元素的类型。
早期C++定义vector的元素是vector是,最后一个闭括号前必须有一个空格,如vector<vector<int> >。但是C++ 11不要求这
样。
定义和初始化定义和初始化vectors
最常有的定义vectors的方法如下:
方法方法 解释解释
vector v1 默认初始化,v1是空的
vector v2(v1) v2有v1每个元素的拷贝
vector v2 = v1 等价于v2(v1)|
vector v3(n, val) v3有n个val
vector v4(n) v3有n个元素,每个元素是value-initialized
vector v5{a, b, c, …} v5的元素即a, b, c, …
vector v5 = {a, b, c,
…}
等价于v5{a, b, c, …}
需要注意的是,最常用使用vector的方法就是定义一个起初为空的vector,即vector<T> v,在运行时指定元素。
vector的列表初始化(list initializing)
上面使用花括号(curly brace)的方法是列表初始化,是C++ 11引入的。
比如,
vector<string> articles = {"an", "a", "the"};
我们看到C++有很多初始化的方式,很多情况下它们是可以互换的,但有些时候初始化的形式是不能换的:
当使用拷贝初始化形式(即使用=),只能提供单个初始化器
当提供in-class初始化,只能是拷贝初始化或者花括号
列表初始化只能使用花括号,不能是圆括号
有关value-initialized
前面提到vector<int> ivec(10)这种只指定元素个数的初始化方法,每个元素是value-initialized。即:
对内置类型,值为0
对类类型,使用默认初始化
花括号,圆括号
vector<int> v1(10); // 10个元素,都是0
vector<int> v1{10}; // 1个元素,是10
vector<int> v1{10, 1}; // 2个元素,分别是10, 1
vector<int> v1(10, 1); // 10个元素,都是1
需要注意的是,使用{}并不一定就是列表初始化;它表示: 如果可能的话,使用列表初始化。
vector<string> v5{"hi"}; // ok, list initialization
vector<string> v6("hi"); // error: cann't construct vector from string lieral
vector<string> v7{10}; // has ten default-initialized value.
上面的v7就使用花括号指定个数,而不是列表初始化。
向向vector添加元素添加元素
使用push_back方法。
重要概念:vector高效增长:
标准要求vector的实现能够在运行时高效添加。如果在定义vector时指定了大小,就显得没必要,甚至导致 差的性能。总之,
一般直接开始定义一个空的vector。
评论0