STL基础--容器vector

    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);

猜你喜欢

转载自blog.csdn.net/pgr_zouxin/article/details/84257844