【温故而知新】C和C++6:STL中的vector容器

来源:互联网 发布:淘宝手柄 编辑:程序博客网 时间:2024/04/19 11:38

向量容器vector是STL中提供的最常用的容器之一,提供了随机访问数组的功能,可以实现对内部元素的随机访问以及方便地在末尾插入和删除数据。vector可以十分方便地实现数据结构中数组、堆栈功能,而且不需要手动编写管理数据结构的相关函数。其定义在头文件<vector>中。


对vector中的元素进行赋值:

向vector中存放数据主要有两种方法,其一是使用push_back函数逐个在vector末尾添加数据;采用这种方法不需要对容器进行初始内存分配,可以直接从一个空的容器开始操作,但是只能依次将元素加载容器的末尾,不是非常灵活。其二是先调用reserve函数预先设置容器大小,然后可以像普通的数组一样分别对其各个元素进行赋值。


获取容器的大小:

在vector中,“尺寸”和“容量”是两个不同的概念,分别用size()和capacity()函数获取。修改这两个值的方法分别为resize()和reverse()。无论如何修改容器,这两个值总是存在限制关系,即vector的size值始终不大于capacity值。可以这么认为,capacity所指的是容器的有效容量,而size所指的是容器的实际大小;并非所有的有效容积都被添加上了数据,而容器内所有数据所占据的空间必须属于有效容量中(汗!好拗口……)。当容器的size扩大并超过了capacity时,capacity的值同时也会扩大到至少同size相同的大小。


判断容器是否为空:

vector提供empty()方法,返回布尔值,为空返回true,非空返回false。


使用迭代器循环遍历成员:

定义一个迭代器需要指定容器名和其中的数据类型。定义和使用方法如:

vector<int>::iterator myIter;vector<int> myVector;......for(myIter = myVector.begin();myIter!=myVector.end();myIter++){......}

在大多数时候,可以采用for_each循环,指定一个范围内的第一个和最后一个迭代器,以及函数的指针以方便地实现对容器对象的批量操作。具体可以参考http://msdn.microsoft.com/en-us/library/e5sk9w9k(v=vs.120).aspx。需要注意的是末尾iterator不包括在处理范围内。

使用STL的算法:
使用算法必须包含定义算法的头文件:#include <algorithm>
1、count和count_if函数可以统计容器中某个元素的个数并作为返回值。其中count_if的参数中有一个函数对象,可以使用更加灵活的方式判断待统计元素满足某个条件的判别准则。
2、find和find_if函数实现容器中某个元素的查找操作。同count一样,find也需要指定开始和结尾的迭代器,并指定查找的目标元素,返回值为一个指向该元素的迭代器。与count_if类似的,find_if也包含一个函数对象作为参数,可以更加细致、个性化地指定查找目标的特性。
3、增加和删除元素:我们知道在vector的末尾增加元素可以使用push_back()方便地完成,除此之外还可以使用insert()函数在任意位置插入元素,只是效率要远低于push_back()。类似的是,可以使用pop_back()和erase()函数实现删除最后一个和任意一个元素。需要注意的是,如果在一个迭代器的循环中erase迭代器指向的元素,这个迭代器将不可再使用。
4、交换对象:vector中实现了swap函数用于两个对象的交换。

                                             
0 0