C++STL容器vector

c/c++

浏览数:259

2019-6-8

vector简介

vector模塑出一个dynamic array,即动态数组。它本身是一个 “将元素置于dynamic array加以管理的抽象概念”,属于序列式容器

使用条件:

包含头文件

#include<vector>

在此头文件中,类型vector是一个定义与namespace std 内的template:

namespace std
{
    template <typename T,
              typename Allocator =allocator<T> >
    class vector;
}

vector的元素可以是任意类型T,可有可无的第二个template参数用来定义内存模型。默认的内存模型是C++标准库提供的allocator(分配器)。

vector性能

1.vector是序列式容器,内部的元素之间存在一种顺序,即有序集合(ordered collection)。

2.vector支持随机访问,提供随机访问迭代器,所以使用与任何STL算法。值得注意的是,vector的高效率体现在末端附加或删除元素,若你在靠近前端的地方安插和删除元素,效率就会变得低下,这是因为作用点后的每一个元素都必须移动到另一个位置,而每一次移动都需要调用assignment操作符。

3.vector的大小与容量

vector采用动态内存分配,一旦超过其当前能够容纳的元素量,vector就会重新分配内部内存。

重新分配内存后:相关reference,pointer,iterator都会失效。并且重新分配内存很耗时间。所以在构建vector时,初始化期间就向构造函数传递额外实参来构建足够的空间是一个很好的选择。

vector具体操作

1.构建,复制与销毁操作

vector<elem> c             //default构造函数,产生一个控的vector,无元素
vector<elem> c(c2)         //copy构造函数,建立c2的同型并成为c2的一份拷贝
vector<elem> c=c2          //copy构造函数,建立一个新的vector作为c2的拷贝
vector<elem> c(n)          //利用元素的default构造函数生成一个大小为n的vector
vector<elem> c(n,x)        //建立一个大小为n的vector,每个元素值都是x
vector<elem> c(beg,end)    //建立一个vector,以区间[beg,end)作为元素初值
c.~vector                  //销毁所有元素,释放内存

2.非更易型操作

c.empty()           //返回容器是否为控
c.size()            //返回目前的元素个数
c.max_size()        //返回元素个数最大可能量
c.capacity()        //返回不进行空间重新分配的情况下元素最大容量
c.reserve(num)      //扩大容量
c.shrink_to_fit()   //要求降低容量,以符合元素个数(保持优化)

值得注意的是,reserve和shrink_to_fit严格上并不是非更易的,它们会使reference,pointer,iterator失效,只是逻辑上vector并没有发生变化。

赋值操作

c=c2              //将c2的全部元素赋值给c
c.assign(n,elem)  //复制n个elem,赋值给c
c.assign(beg,end) //将区间[beg,end)的元素赋值给c
c.swap(c2)
swap(c,c2)        //都是置换c与c2的数据

3.元素访问操作

欲访问vector所有元素,你必须使用rbf循环,特定的操作函数或迭代器。按索引操作时其操作与数组操作原则类似,即下标从0开始,末尾size()-1。

c.[id]    //返回索引id所指向的元素(不检查范围)
c.at(id)  //返回索引id所指向的元素(超出范围就抛出out_of_range异常
c.front() //返回第一元素(不检查是否存在)
c.back()  //返回最末元素(不检查是否存在)

4.迭代器相关函数

vector提供的是一个random-access iterator,即随机访问迭代器。

我们仅列出常用的操作函数

c.begin()              //返回一个迭代器指向第一元素
c.end()                //返回一个迭代器指向最末元素的下一位置
c.rbegin()             //返回一个反向迭代器指向反向迭代的第一元素
c.rend()               //返回一个反向迭代器指向反向迭代的最末元素的下一位置
c.push_back(elem)      //附加一个elem的拷贝于末尾
c.pop_back()           //移除最后一个元素,但是不返回
c.insert(pos,elem)     //在iterator位置pos之前方插入一个elem拷贝,并返回新元素的位置
c.insert(pos,n,elem)   //在ierator位置pos之前方插入n个elem拷贝,并返回第一个新元素的位置,若没有元素,则返回pos
c.insert(pos,beg,end)  //在ierator位置pos之前方插入区间[beg,end)内所有元素的拷贝,并返回第一个新元素的位置,若没有元素,则返回pos
c.erase(pos)           //移除iterator位置pos上的元素,返回下一个元素的位置
c.erase(beg,end)       //移除区间[beg,end)内的所有元素,返回下一个元素的位置
c.resize(num)          //将元素数量改为num,如果size()变大,多出的新元素都要以default函数初始化
c.resize(num,elem)     //将元素数量改为num,如果size()变大,多出新元素都是elem的拷贝
c.clear()              //移除所有元素,清空容器

 5.直接移除与某值相等的所有元素

vector并没有提供任何函数来实行该操作,在这里我们可以使用算法

vector<elem> c;
c.erase(remove(c.begin(),c.end(),val),c.end());

来删除所有值为val的元素

此外,vector还针对class vector<bool>实现了一个特殊优化版本,旨在同样数量元素下,耗用更小的空间,但同时效能可能会减低,不符合速度优先的宗旨,在此就不做赘述。

作者:回首不知身是客