+ -
当前位置:首页 → 问答吧 → vector清空的问题

vector清空的问题

时间:2011-12-20

来源:互联网

#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0;
  vector<int> v;
cout<<v.size()<<endl;
cout<<v.empty()<<endl;
  for( i = 0; i < 10; i++ )
{
v.push_back( i+1 );//把元素一个一个存入到vector中
}
v.clear();
cout<<v.size()<<endl;
cout<<v.empty()<<endl;
cout<<v[4]<<endl;

为什么调用了v.clear()函数清空v后,v[4]的输出还是5?
怎么样才能将v中的内容完全删除?如果不删除的话那对下一次v的使用会不会产生影响?

作者: wkq87   发布时间: 2011-12-20

v.erase(v.begin(),v.end());

作者: yisikaipu   发布时间: 2011-12-20

越界了 , []不检查越界

你试试用v.at(4)看看报错不报错

作者: akirya   发布时间: 2011-12-20

引用 1 楼 yisikaipu 的回复:v.erase(v.begin(),v.end());


秀逗了,这个等价于v.clear();

作者: yisikaipu   发布时间: 2011-12-20

其实已经清空了,VECTOR里面的本质就是在堆上分配一段空间容纳元素,clear就已经把这段内存给释放了,但是,只不过你用下标操作访问的还是对应地址空间里的值,你这里是内置类型int,比较特殊,如果是自定义类型或者string你将发现内容就是错误的,内置类型系统是直接覆盖内存空间的,不调用析构函数。
另外,你size();一下就会发现大小已经为0,这说明已经清空

作者: qscool1987   发布时间: 2011-12-20

首先,vector与deque不同,其内存占用空间只会增长,不会减小。比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有空间在vector析构时回收。
  如果你觉得害怕,有一种方法就是调用v.clear()后,将V的大小置为0,但是C++标准并不支持,毕竟那片内存没有被处理掉。 所以如果要处理掉那片内存,可以采用以下方法:
  v.swap(vector<int>());  
  该语句的思路是先构造一个临时的空向量,然后将V与该空向量对调,这样V就空了,在该语句结束时,临时向量对象将会被销毁,所以V之前的那部分内存也就被释放了。(参考STL中文版)

作者: quhangprogram   发布时间: 2011-12-20

LZ的代码我放到vs2010运行出错,cout<<v[4]<<endl;报错

作者: herocxgood   发布时间: 2011-12-20

clear已经将此容器清空了啊,楼主在运行是运行到最后一步会造成数组越界。程序就崩溃了。不会输出5的。

作者: lixinjie241   发布时间: 2011-12-20

引用 6 楼 herocxgood 的回复:
LZ的代码我放到vs2010运行出错,cout<<v[4]<<endl;报错


仅能对确知已存在的元素进行下标操作。

作者: ycguhang   发布时间: 2011-12-20

问个问题

怎么能快速获取 Vector 容器里面 最后那个值?

作者: ycguhang   发布时间: 2011-12-20

换个好点的编译器。clear会把内存释放的。根本访问不到V[4]。erase不释放内存,只是析构

作者: mingliang1212   发布时间: 2011-12-20

热门下载

更多