STL系列:vector容器

来源:互联网 发布:ps调色插件 mac 编辑:程序博客网 时间:2024/05/10 02:57

一个容器中的所有对象都必须是同一种类型的。

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 vectorfor (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 elementsvector<int>::const_itetator//an iterator whose value cannot changeconst vector<int>::iterator

任何改变vector长度的操作都会使已存在的迭代器失效。

6、迭代器的算术操作:

iter + n

iter – n

iter1 – iter2

但没有iter1 + iter2

vector<int>::iterator mid =(vi.begin() + vi.end())/2;//error


 

0 0