一个容器中的所有对象都必须是同一种类型的。
vector 头文件 :<vector>
vector是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。
- 注意:
vector不是一种数据类型,vector<int>和vector<string>都是数据类型。
1、定义与初始化:
</pre><pre name="code" class="cpp">vector<T> v1; //vector保存类型为T的对象,默认构造函数,v1为空
vector<T> v2(v1); //v2是v1的一个副本
vector<T> v3(n, i); //v3包含n个值为i的元素
vector<T> v4(n); //v4含有值初始化的元素的n个副本
2、动态增长:
vector对象(以及其他标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态地增加元素。
3、常用vector操作:
函数 | 表述 |
c.assign(beg,end) c.assign(n,elem) | 将[beg; end)区间中的数据赋值给c。 将n个elem的拷贝赋值给c。 |
c.at(idx) | 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 |
c.back() | 传回最后一个数据,不检查这个数据是否存在。 |
c.begin() | 指向迭代器中的第一个数据地址。 |
c.capacity() | 返回容器中数据个数。 |
c.clear() | 移除容器中所有数据。 |
c.empty() | 判断容器是否为空。 |
c.end() | 指向迭代器中的最后一个数据地址。 |
c.erase(pos) c.erase(beg,end) | 删除pos位置的数据,传回下一个数据的位置。 删除[beg,end)区间的数据,传回下一个数据的位置。 |
c.front() | 传回第一个数据。 |
get_allocator | 使用构造函数返回一个拷贝。 |
c.insert(pos,elem) c.insert(pos,n,elem) c.insert(pos,beg,end) | 在pos位置插入一个elem拷贝,传回新数据位置。 在pos位置插入n个elem数据。无返回值。 在pos位置插入在[beg,end)区间的数据。无返回值。 |
c.max_size() | 返回容器中最大数据的数量。 |
c.pop_back() | 删除最后一个数据。 |
c.push_back(elem) | 在尾部加入一个数据。 |
c.rbegin() | 传回一个逆向队列的第一个数据。 |
c.rend() | 传回一个逆向队列的最后一个数据的下一个位置。 |
c.resize(num) | 重新指定队列的长度。 |
c.reserve() | 保留适当的容量。 |
c.size() | 返回容器中实际数据的个数。 |
c1.swap(c2) swap(c1,c2) | 将c1和c2元素互换。 同上操作。 |
vector<Elem> c vector <Elem> c1(c2) vector <Elem> c(n) vector <Elem> c(n, elem) vector <Elem> c(beg,end) c.~ vector <Elem>() | 创建一个空的vector。 复制一个vector。 创建一个vector,含有n个数据,数据均已缺省构造产生。 创建一个含有n个elem拷贝的vector。 创建一个以[beg;end)区间的vector。 销毁所有数据,释放内存。 |
仅能对确知已存在的元素进行下标操作
vector<int> ivec; // empty vector
for (vector<int>::size_type ix = 0;ix != 10; ++ix)
ivec[ix] = ix; //disaster: ivec has noelements
// ivec.push_back(ix);
4、迭代器(iterator)
迭代器是一种检查容器内元素并遍历元素的数据类型。迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素。若一种类型支持一组确定的操作(这些操作可用来遍历容器内的元素,并访问这些元素的值),我们就称这种类型为迭代器。
vector<int>::iterator iter;
由end操作返回的迭代器并不指向vector中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector中所有元素。
迭代器类型可以使用解引用操作符(*)来访问迭代器所指向的元素;不能对end操作进行解引用或自增操作。
5、const_iterator
该类型只能用于读取容器内元素,但不能改变其值。
不要把const_iterator对象与const的iterator对象混淆起来。声明一个const迭代器时,必须初始化迭代器,一旦被初始化后,就不能改变它的值。
//an iterator that cannot write elements
vector<int>::const_itetator
//an iterator whose value cannot change
const vector<int>::iterator
任何改变vector长度的操作都会使已存在的迭代器失效。
6、迭代器的算术操作:
iter + n
iter – n
iter1 – iter2
但没有iter1 + iter2
vector<int>::iterator mid =(vi.begin() + vi.end())/2;//error