vector的resize()是改变了size的大小,没有改变capacity啊.如何改变capacity呢?

numddd 2011-07-12 03:36:07
下面这段代码:

#include <iostream>
#include <vector>
void main( void )
{
std::vector<int> v(200);
std::cout<<v.size()<<','<<v.capacity()<<std::endl;
v.push_back(1);
v.push_back(2);
std::cout<<v.size()<<','<<v.capacity()<<std::endl;
v.empty();
std::cout<<v.size()<<','<<v.capacity()<<std::endl;
v.resize(0);
std::cout<<v.size()<<','<<v.capacity()<<std::endl;
}

运行输出:
200,200
202,300
202,300
0,300
Press any key to continue . . .

问题是,为什么resize命令其实并没有改变capacity? 我如果想改变的话怎么办呢?
...全文
560 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hai040 2011-07-12
  • 打赏
  • 举报
回复
reserve只能放大不能缩小
要清空用1L说的swap
赵4老师 2011-07-12
  • 打赏
  • 举报
回复
参考C:\Program Files\Microsoft Visual Studio\VC98\Include\VECTOR
numddd 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

reserve();
[/Quote]

reserve()函数不行:

#include "stdafx.h"
#include <iostream>
#include <vector>
void main( void )
{
std::vector<int> v(200);
std::cout<<v.size()<<','<<v.capacity()<<std::endl;
v.push_back(1);
v.push_back(2);
std::cout<<v.size()<<','<<v.capacity()<<std::endl;
v.reserve(0);
std::cout<<v.size()<<','<<v.capacity()<<std::endl;
}

现在的输出是:
200,200
202,300
202,300
Press any key to continue . . .
pengzhixi 2011-07-12
  • 打赏
  • 举报
回复
reserve();
至善者善之敌 2011-07-12
  • 打赏
  • 举报
回复
你加条v.reserve(0);就知道了
老邓 2011-07-12
  • 打赏
  • 举报
回复 2
vector与deque不同,其内存占用空间只会增长,不会减小。比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有空间在vector析构时回收。

empty()是用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),所占用的内存空间依然如故。如果你需要空间动态缩小,可以考虑使用deque。如果非要用vector,这里有一个办法:

在《effective STL》和其实很多C++文章中都有指明,用clear()无法保证内存回收。但是swap技法可以。具体方法如下所示:
vector<int> nums;
nums.push_back(1);nums.push_back(1);nums.push_back(2);nums.push_back(2);
vector<int>().swap(nums); //或者nums.swap(vector<int>());

vector<int>().swap(nums); 或者如下所示 加一对大括号都可以,意思一样的:
{
std::vector<int> tmp = nums;
nums.swap(tmp);
}
加一对大括号是可以让tmp退出{}的时候自动析构

swap技法就是通过交换函数swap(),使得vector离开其自身的作用域,从而强制释放vector所占的内存空间。
老邓 2011-07-12
  • 打赏
  • 举报
回复
swap

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧