STL基础--容器vector

3 篇文章 0 订阅
1 篇文章 0 订阅

    vector的内存:占用一段连续的内存,所以vector拥有array的特性:支持随机查询即能够用下标快速访问指定的元素。

    vector能够实时的增加或减少元素,如果在首部或者中间插入、删除元素时,后面的所有元素都要移动,效率很差。

    vector增加元素时,如果当前内存块内存不够用时会发生内存块更换,从而引发iterator失效

    适用范围:随机查询、后入后出

  • 构造方法
vector<T> cdefault构造函数,产生一个空的vector,没有任何元素
vector<T> c(c1)copy构造函数
vector<T> c = c1copy构造函数
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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值