Vector容器的一点说明

1 篇文章 0 订阅

1. resize 与 reserve

先看一个简单的例子:

//使用resize
std::vector<int> vec1;
vec1.resize(10);
vec1.push_back(10);  // 第11个元素
vec1.push_back(10);  // 第12个元素
// 使用reserve
std::vector<int> vec2;
vec2.reserve(10);
vec2.push_back(10);  // 第1个元素
vec2.push_back(10);  // 第1个元素

通过查看vector的源代码,就可以很容易地看到:

>> resize(10)使用10个默认初值(此处为0)的对象(int类型)去填充10个区域,这可以通过vec1.size()获得的vec1的大小验证,如果要改变这10个元素的值,可用直接使用vec1[0] = 10....

>> reserve(10)仅仅是预分配 10个int类型的空间,而不改变vector的大小(vec1.size() = 0)

 

2. swap 与 clear

 从两个函数的名字就可以清楚地了解到:swap是用于交换两个容器的内容,clear是用于清空当前的容器。这里要说明的是,swap与clear都可以用以“清空”当前的容器(涉及到swap的巧妙用法)。不过两者对vector的底层影响并不一样。看看下面的代码: 

// 使用clear
std::vector<int> vec1;
for (int i = 0; i < 10; ++i) {
    vec1.push_back(10);
} // size = 10, capacity >= 10(13)
vec1.clear(); // size = 10, capacity不变
// 使用swap
std::vector<int> vec2;
for (int i = 0; i < 10; ++i) {
    vec2.push_back(10);
} // size = 10, capacity >= 10(13)
vec2.swap(std::vector<int>()); // size = 0, capacity = 0

可以看出:clear仅仅清空vecotr中的数据,而不改变vector的实际物理空间大小。swap能够彻底改变vector的物理空间(这点往往很重要)。

 

3. 对象元素的一些说明

在vector中插入对象(class)要注意对象的构造与析构所引起的额外消耗,如:函数调用的系统消耗,函数本身的消耗等。即使一个空的构造/析构函数,对于数量非常庞大的函数调用的开销还是不能不考虑的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值