加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 删除std :: vector的元素(和更改大小),而不会影响已分配的

发布时间:2020-12-16 07:04:47 所属栏目:百科 来源:网络整理
导读:我正在使用如下代码: const int MY_SIZE = 100000;std::vectordouble v;v.reserve(MY_SIZE);// add no more than MY_SIZE elements to the vectorf(v); v.clear();// again,add no more than MY_SIZE elements to the vectorf(v);v.clear();//// etc...//
我正在使用如下代码:

const int MY_SIZE = 100000;
std::vector<double> v;
v.reserve(MY_SIZE);

// add no more than MY_SIZE elements to the vector

f(v);    
v.clear();

// again,add no more than MY_SIZE elements to the vector

f(v);
v.clear();

//
// etc...
//

我的代码的重点是存储MY_SIZE double,然后对这些元素执行操作f(std :: vector< double>).在我填充向量并执行操作之后,我想摆脱所有元素(并将std :: vector :: size()重置为0),然后添加更多元素.但是,这里的关键是我不想导致为向量分配的内存空间被更改.

请注意,我永远不会向v添加超过MY_SIZE元素,因此v永远不需要重新分配比v.reserve(MY_SIZE)分配的内存更多的内存.

所以,当我在上面的代码中调用v.clear()时,它会以任何方式影响v.reserve(MY_SIZE)分配的空间量或v.begin()的内存位置吗?

相关问题:如果我调用v.erase(v.begin(),v.begin()v.size()),它是否会以任何方式影响v.reserve(MY_SIZE)分配的空间量或者位置v.begin()的记忆?

如果我真的只想删除所有元素,我会调用clear().但是我想知道这个相关的问题,因为有时候我只需要擦除v的前X个元素,并且在这些情况下我想保留由v.reserve(MY_SIZE)分配的内存而我不想要v的位置要改变.

解决方法

似乎C标准(2003)隐含地保证如果调用std :: vector的clear()或erase()方法,则不会重新分配内存.

根据序列的要求(表67),a.clear()等同于a.erase(begin(),end()).

此外,该标准规定了std :: vector< T>的erase(…)成员函数.除非T的拷贝构造函数抛出异常(第23.2.4.3节),否则不会抛出异常.因此,它是隐式保证的,因为重新分配可能导致异常(第3.7.3节,第20.4.1.1节).

v.begin()也保持不变,因为erase(…)只会在擦除点之后使所有迭代器无效(第23.2.4.3节).但是,它不会被解除引用(因为v.begin()== v.end()).

所以,如果你有一个符合标准的实现,你很好……

更正

我的推理是有缺陷的.我设法显示erase(…)没有重新分配,但是如果擦除所有元素,实现仍然可以释放内存.但是,如果a.capacity()在擦除/清除后报告“你可以添加N个元素而不重新分配内存”,那么你没事.

C 11标准定义了a.clear()而没有引用a.erase(…). a.clear()不允许抛出异常.因此它可以解除分配,但不能重新分配.因此,您应该在清除向量后检查容量,以确保内存仍然存在,并且下一次调整大小将不会重新分配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读