vector的内存:占用一段连续的内存,所以vector拥有array的特性:支持随机查询即能够用下标快速访问指定的元素。
vector能够实时的增加或减少元素,如果在首部或者中间插入、删除元素时,后面的所有元素都要移动,效率很差。
vector增加元素时,如果当前内存块内存不够用时会发生内存块更换,从而引发iterator失效
适用范围:随机查询、后入后出
- 构造方法
vector<T> c | default构造函数,产生一个空的vector,没有任何元素 |
vector<T> c(c1) | copy构造函数 |
vector<T> c = c1 | copy构造函数 |
vector<T> c(move(c1)) | move构造函数 |
vector<T> c = move(c1) | move构造函数 |
vector<T> c(n) | 利用元素的default构造函数生成一个大小为n的vector |
vector<T> c(n, val) | 建立一个大小为n的vector,每个元素都是val |
vector<T> c(beg, end) | 建立一个vector,以区间[beg, end)为元素初值 |
vector<T> c(initlist) | 建立一个vector,以初值列initlist为元素初值 |
vector<T> c = initlist | 建立一个vector,以初值列initlist为元素初值 |
- 增加元素
push_back(val) | 附加一个val的拷贝于末尾 |
insert(pos, val) | pos之前插入一个val的拷贝,并返回新元素的位置 |
insert(pos, n, val) | pos之前插入n个val的拷贝,并返回第一个新元素的位置 |
insert(pos, beg, end) | pos之前插入区间[beg, end)内所有元素的拷贝,并返回第一个新元素的位置 |
insert(pos, initlist) | pos之前插入区间initlist内所有元素的拷贝,并返回第一个新元素的位置 |
emplace(pos, args...) | pos前插入一个以args为初值的元素,并返回新元素的位置 |
emplace_back(args) | 末尾附加一个以args为初值的元素,不返回任何内容 |
resize(n) | 将元素数量改为n,如果size()变大,多出来的元素以default构造函数初始化 |
resize(n, val) | 将元素数量改为n,如果size()变大,多出来的元素初始化为val |
- 删除元素
pop_back() | 移除最后一个元素 |
erase(pos) | 移除pos上的元素,并返回下一个位置 |
erase(beg, end) | 移除区间[beg, end)内的所有元素,并返回下一位置 |
resize(n) | 将元素数量改为n,如果size()变大,多出来的元素以default构造函数初始化 |
resize(n, val) | 将元素数量改为n,如果size()变大,多出来的元素初始化为val |
clear() | 移除所有元素,将容器清空 |
- 修改操作
c = c1 | 将c1全部元素赋值给c |
c = move(c1) | 将c1的所有元素以move assign方式给予c |
c = initlist | 将初值列initlist的所有元素赋值给c |
assign(n, val) | 复制n个val, 赋值给c |
assign(beg, end) | 将区间[beg, end)内的元素赋值给c |
assign(initlist) | 将初值列initlist的所有元素赋值给c |
c1.swap(c2) | 置换c1和c2的数据 |
swap(c1, c2) | 置换c1和c2的数据 |
- 其他查询类操作
empty() | 返回容器是否为空(相当于size() == 0) |
size() | 返回目前元素个数 |
max_size() | 返回元素个数的最大可能量 |
capacity() | 返回“不进行空间重新分配”条件下的元素最大容纳量 |
reserve() | 如果容量不足,扩大之 |
shrink_to_fit() | 要求降低容量,以符合元素个数 |
c[idx] | 返回索引idx所指的元素 |
at(idx) | 返回索引idx所指的元素 |
front() | 返回第一个元素 |
back() | 返回末尾元素 |
- 迭代器相关
begin() | 返回一个random-access iterator指向第一元素 |
end() | 返回一个random-access iterator指向最末元素的下一位置 |
cbegin() | 返回一个const random-access iterator指向第一元素 |
cend() | 返回一个const random-access iterator指向最末元素的下一位置 |
rbegin() | 返回一个反向(reverse) iterator指向反向迭代的第一个元素 |
rend() | 返回一个反向(reverse) iterator指向反向迭代的最末元素的下一位置 |
crbegin() | 返回一个反向const reverse iterator指向反向迭代的第一个元素 |
crend() | 返回一个反向const reverse iterator指向反向迭代的最末元素的下一位置 |
下面是一个关于vector内存分布的大致猜测:
vector能够使用下标进行随机查询,所以我们能够确定vector存储元素的主体部分是类似array的内存分布,那么我们再来看一下在vector<int> vcInt中,&vcInt与&vcInt[0]是否相等或是在内存地址上有什么联系:
int main()
{
vector<int> vcInt({ 1,2,3,4 });
cout << "&vcInt : " << &vcInt << endl;
cout << "&vcInt[0]: " << &vcInt[0] << endl;
cout << "&vcInt[1]: " << &vcInt[1] << endl;
system("pause");
return 0;
}
输出结果为
显然vector存放元素的部分是单独分配的一段内存,且结构与数组一样(是不是很有趣,是不是很好奇&vcInt这块内存中存放的是什么结构/坏笑)
那么我们在将vector拷贝到数组array[]时是不是也可以这么使用:
memcpy(array, &vcInt[0], size_t);