目录
Vector
vector本身是“将元素至于dynamic array(动态数组)中加以管理,C++standard并未要求必须以dynamic array 实现vector,仅仅是规定起相应条件和操作复杂度;
使用vector包含头文件#include<vector>,在此头文件内类型vector是一个定义与namespace std 内的template。
namespace std{
template <typename T, typename Allocator = allocator<T> >
class vector;
}
Vector的元素是任意类型T。可有可无的第二个template参数用来定义内存模型(memory modle)。默认内存模型是C++标准提供的allocator。
Vector能力
Vector将元素复制到内部的dynamic array中。元素之间总是存在一定的顺序。所以vector是一种有序集合(ordered collection)。Vector支持随机访问,Vector提供的随机访问迭代器使用任何STL算法。
Vector在末端附加或删除元素,效率相当的好,但是在前端或中间插或删除元素效率便不怎么样,因为作用点之后的每一个元素都必须移动另一位置,而一次移动都要调用assignment操作符。
大小(size)和容量(capacity)
Vector高效率原因之一是分配的空间会多余容纳的元素空间。
Vector提供操作大小的函数有:
- size( ):返回vector元素数量
- empty( ):判断容器是否为空(相当于size ( ) == 0,但可能更快)
- max_size( ):返回元素最大可能数量
- capacity( ):返回vector实际容纳元素量,如果超过这个量,vector便重新分配内存
Vector的操作
构建、复制和销毁
操作 | 效果 |
vector<Elem> c | Default构造函数,产生空vector |
vector<Elem> c(c2) | Copy函数,建立新vector作为c2的拷贝(所有元素都被复制) |
vector<Elem> c = c2 | Copy函数,建立新vector作为c2的拷贝(所有元素都被复制) |
vector<Elem> c (rv) | Move构造函数,建立一个新vector,取rvalue rv的内容(C++11) |
vector<Elem> c = rv | Move构造函数,建立一个新vector,取rvalue rv的内容(C++11) |
vector<Elem> c(n) | Default构造函数生成一个大小为n的vector |
vector<Elem> c(n,elem) | 建立大小为n的vector,每个元素值都是elem |
vector<Elem> c(beg,end) | 以区间[beg , end)为元素初始值 |
vector<Elem> c(initlist) | 以初始列initlist的元素为初始值(C++11) |
vector<Elem> c = initlist | 以初始列initlist的元素为初始值(C++11) |
c.~vector() | 销毁所有元素,释放内存 |
非更易型操作
操作 | 效果 |
c.empty() | 返回是否容器为空(相当于size()==0但也许较快) |
c.size() | 返回目前的元素个数 |
c.max_size() | 返回元素个数之最大可能量 |
c.capacity() | 返回“不进行空间重新分配”条件下的元素最大容量 |
c.reserve(num) | 如果容量不足,扩大之 |
c.shrink_to_fit() | 要求降低容量,以符合元素个数(C++11) |
c1 == c2 | 返回c1是否等于c2(对每个元素调用==) |
c1 != c2 | 返回c1是否不等于c2(相当于!(c1==c2)) |
c1 < c2 | 返回c1是否小于c2 |
c1 > c2 | 返回c1是否大于c2(相当于c2<c1) |
c1 <= c2 | 返回c1是否小于等于c2(相当于!(c2<c1)) |
c1 >= c2 | 返回c1是否大于等于c2(相当于!(c1<c2)) |
赋值
操作 | 效果 |
---|---|
c = c2 | 将c2的全部元素赋值给c |
c = rv | 将rvalue rv的所有元素以move assign方式给予c(C++11) |
c = initlist | 将初值列initlist的所有元素赋值给c |
c.assign(n,elem) | 复制n个elem,赋值给c |
c.assign(beg,end) | 将区间[beg,end)内的元素赋值给c |
c.assign(initlist) | 将初值列initlist的所有元素赋值给c |
c1.swap(c2) | 置换c1和c2的数据 |
swap(c1,c2) | 置换c1和c2的数据 |
元素访问
操作 | 效果 |
---|---|
c[idx] | 返回索引idx所指的元素(不检查范围) |
c.at(idx) | 返回索引idx所指的元素(如果idx超出范围就抛出range-error异常 |
c.front() | 返回第一元素(不检查是否存在第一元素) |
c.back() | 返回最末元素(不检查是否存在最末元素) |
调用 front( ) 或 back( ) 时必须确定容器不为空。
迭代器相关函数
操作 | 效果 |
c.begin() | 返回一个random-access iterator指向第一个元素 |
c.end() | 返回一个random-access iterator指向最末元素的下一位置 |
c.cbegin() | 返回一个const random-access iterator指向第一个元素(C++11) |
c.cend() | 返回一个const random-access iterator指向最末元素的下一位置(C++11) |
c.rbegin() | 返回一个反向的(reverse)iterator指向反向迭代的第一元素 |
c.rend() | 返回一个反向的(reverse)iterator指向反向迭代的最末元素的下一位置 |
c.crbegin() | 返回一个const reverse iterator指向反向迭代的第一元素(C++11) |
c.crend() | 返回一个const reverse iterator指向反向迭代的最末元素的下一位置(C++11) |
安插和移除
操作 | 效果 |
c.push_back(elem) | 附加一个elem的拷贝于末尾 |
c.pop_back() | 移除最后一个元素,但是不返回它 |
c.insert(pos,elem) | 在iterator位置pos之前插入一个elem拷贝,并返回新元素的位置 |
c.insert(pos,n,elem) | 在iterator位置pos之前插入n个elem拷贝,并返回第一个新元素的位置(或返回pos–如果没有新元素的话) |
c.insert(pos,beg,end) | 在iterator位置pos之前插入区间[beg,end)内所有元素的一份拷贝,并返回第一个新元素的位置(或返回pos——如果没有新元素的话,C++11) |
c.insert(pos,initlist) | 在iterator位置pos之前插入初值列initlist内所有元素的一份拷贝,并返回第一个新元素的位置(或返回pos——如果没有新元素的话,C++11) |
c.emplace(pos,args…) | 在iterator位置pos之前插入一个以args为初值的元素,并返回新元素的位置(C++11) |
c.emplace_back(args…) | 附加一个以args为初值的元素于末尾,不返回任何东西(C++11) |
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() | 移除所有元素,将容器清空 |
Class vector<bool>
操作 | 效果 |
c.flip() | 将所有bool元素值反相(negate),亦即对所有bit求补数 |
c[idx].flipt() | 将索引idx所指的bit元素反相(对单一bit求补数) |
c[idx] = val | 将索引idx所指的bit元素赋值为val(赋值单一bit) |
c[idx1] = c[idx2] | 将索引idx1所指的bit元素赋值为索引idx2所指的bit元素值 |
C++标准库针对bool的vector<>专门设计了一个特化版。一般vector<bool>实现版本会给每个bool元素分配至少1byte空间、而vector<bool>特化版的内部只使用1bit存放一个元素。但是C++最小可定址值是byte为单位,所以对vector特化版dreference和iterator也做特殊处理。