C++ Standard Library 之vector介绍 | ||
| 【简介】 C++标准库中的vector是表示数组的序列容器,大小可以改变。 vector是一种标准容器,它提供对任意顺序的单个元素的固定时间访问。 vector将元素赋值到内部的dynamic arry(动态数组)中,元素之间总是存在一定的顺序,所以vector是一个有序集合。支持随机访问,因此只要知道位置,你可以在常量时间内访问任何一个元素。vector提供随机访问迭代器,所以适用于任何STL算法。 如果你在末端附加或者删除元素,vector的效率相当好。但是你在前端或者中段插入或删除元素,效率就不怎么样了,因为作用点之后的每一个元素都必须移到另一位置,而每次移动都得调用assignment操作符。 | ||
| 【头文件】 #include | ||
| 【函数原型】 template // 参数1可以是任意类型_Tp,可有可无的第二个参数用来定义内存模型(memery model),默认的内存模型是C++标准库提供的allocator) class vector; | ||
| 【声明】 vector | ||
| 【vector的大小和容量】 如果超过当前vector能容纳的量,vector就要重新分配内存: 1、一旦重新分配内存,vector元素相关的所有reference、pointer、interator都会失效 2、内存重新分配很耗时间。 避免重新分配内存的解决方案: 1、使用reserve()保留适当容量,避免重新分配内存,如此一来,只要保留的容量差不多足够用,就不用担心reference失效: vector v.reserve(80); //预留80个元素的内存 2、初始化期间就向构造函数传递额外实参,构建足够的空间。如果你的实参是个数值,它将成为vector的起始大小。 vector | ||
| 构造函数 | 操作 | 效果 |
| vector | DEFAULT默认构造函数,产生一个空vector,没有任何元素。 | |
| vector | COPY拷贝构造函数,建立c2的同型vector并成为c2的一份拷贝(所有元素都被复制)。 | |
| vector | COPY拷贝构造函数,建立一个新的vector作为c2的一份拷贝(所有元素都被复制)。 | |
| vector | MOVE构造函数,建立一个新的vector,取rvalue rv的内容。C++11 | |
| vector | MOVE构造函数,建立一个新的vector,取rvalue rv的内容。C++11 | |
| vector | 利用元素的default构造函数生成一个大小为n的vector | |
| vector | 创建一个大小为n的vector,每个元素值都是elem。例如vector | |
| vector | 创建一个vector,以区间[begin,end)作为元素初始值。例如可以使用上面定义过的vector a 的区间元素来创建个b: vector | |
| vector | 创建一个vector,以初始列initlist的元素为初始值。 C++11 | |
| vector | 创建一个vector,以初始列initlist的元素为初始值。 C++11 | |
| 析构函数 | c.~vector | 销毁所有元素,释放内存 |
| 判断 非更易型操作 (Nonmodifying Operation) | c.empty() | 返回容易是否为空(相当于size()==0,但'也许‘比较快) |
| c.size() | 返回目前元素的个数 | |
| c.capacity() | 返回“不进行空间重新分配” 条件下的元素的最大容量。 | |
| c.reserve(num) | 如果容量不足,扩大之。(注意:reserve()和shrink_to_fit()会变更vector,因为它们会造成所有指向元素的reference、pointer、iterator失效) | |
| c.shrink_to_fit() | 降低容量,以符合元素个数。C++11 | |
| c1 == c2 | 操作符有 == 、!=、 <、 <=、 >、>=等,它的作用跟你想的一样,嗯。 | |
| 赋值 | c = c2 | 将c2的全部元素赋值给c |
| c = rv | 将rvalue rv的所有元素以move assign方式给予c。C++11 | |
| c = initlist | 将初值列initlist的所有元素赋值给c。C++11 | |
| c.assign(n,elem) | 赋值n个elem,赋值给c | |
| c.assign(begin,end) | 将区间[begin,end)区间的元素赋值给c | |
| c.assign(initlist) | 将初值列initlist的所有元素赋值给c。C++11 | |
| c1.swap(c2) | 置换c1和c2的数据 | |
| swap(c1,c2) | 置换c1和c2的数据 | |
| 访问元素 | 【说明】如果要访问所有vector元素,你必须得使用range-base for循环、或特定的操作函数、或使用迭代器 | |
| c[idx] | 返回索引idx所指的元素 | |
| c.at[idx] | 返回索引idx所指的元素,如果idx超出范围就抛出range-error异常 | |
| c.front() | 返回第一个元素(不检查是否存在第一个元素) | |
| c.back() | 返回最末元素(不检查是否存在最末尾的元素) | |
| vector迭代器 | 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的拷贝于末尾 |
| c.pop_back() | 移除最后一个元素,但不返回 | |
| c.insert(pos,elem) | 在iterator位置pos前方插入一个elem拷贝,并返回新元素的位置。pos指的是迭代器所指向的位置(position),例如:a.insert(a.begin(),9); 在a的首位插入9 | |
| c.insert(pos,n,elem) | 在iterator位置pos前方插入n个elem拷贝,并返回第一个新元素的位置,(如果没有新元素返回pos) | |
| c.insert(pos,begin,end) | 在iterator位置pos之前方插入区间[begin,end)内所有元素的一份拷贝,并返回第一个新元素的位置,(如果没有新元素返回pos)。 | |
| 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(begin,end) | 移除[begin,end)区间内的所有元素,返回下一元素的位置。(其实这个begin和end指的都是元素的下标) | |
| c.resize(num) | 将元素数量改为num(如果size()变大,多出来的新元素都需要以default构造函数完成初始化。) | |
| c.resize(num,elem) | 将元素数量改为num(如果size()变大,多出来的新元素都是elem的拷贝) | |
| c.clear() | 移除所有元素,将容器清空 | |
| 异常处理 | vector只支持最低限度的逻辑错误检查,下标操作符的安全版本at()是唯一可以抛出异常的函数。 析构函数不得抛出异常。 | |
| 特化版本:class vector | c.flip() | 将所有bool元素值相反(negate),也就是对所有Bit求补数。 |
| c[idx].flip() | 将索引idx所指的bit元素相反,也就是对单一bit求补数。 | |
| c[idx] = val | 将索引idx所指的Bit元素赋值为val | |
| c[idx_1] = c[idx_2] | 将索引idx_1所指的bit元素赋值为索引idx_2所指的bit元素值 | |



