c – 删除std :: vector的元素(和更改大小),而不会影响已分配的
我正在使用如下代码:
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()不允许抛出异常.因此它可以解除分配,但不能重新分配.因此,您应该在清除向量后检查容量,以确保内存仍然存在,并且下一次调整大小将不会重新分配. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |