我正在创建一个使用std :: vector来保存一堆对象的程序。
std::vector<Ball> balls;
for (int i = 0; i < ball.size(); ++i){
if (...some condition...){
//How should I delete balls[i]
}
如果我这样做
std::vector<Ball> balls;
//put a bunch of balls in balls
for (int i = 0; i < ball.size(); ++i){
if (...some condition...){
balls.erase(balls.begin() + i);
}
每个球都没有动态分配的内存,这样可以完全清理球[i]吗?我是否永远不必担心撞锤上存在的球?
感谢所有帮助人员!
答案 0 :(得分:0)
&#34;每个球都没有动态分配的内存,所以这会完全清理
balls[i]
吗?我是否永远不必担心撞锤上存在球?&#34;
是的,您不必担心Ball
类实例,但内存管理由std::vector<>
类在内部完成。所以这并不意味着std::vector<>
会自动缩小它为已删除项目动态分配的内存。
使用当前标准,您可以在删除多个项目后使用std::vector<>::shrink_to_fit()
建议执行此操作。
答案 1 :(得分:0)
我认为你的意思是以下
#include <vector>
#include <algorithm>
//...
std::vector<Ball> balls;
//...
balls.erase( std::remove_if( balls.begin(), balls.end(),
[] ( const Ball &b ) { return somecondition( b ); } ),
balls.end() );
方法擦除将为向量的所有已擦除元素调用析构函数。实际上,该类调用了一个放置释放函数。
答案 2 :(得分:0)
您可能需要将erase_remove惯用法应用于条件清理:
balls.erase(std::remove_if(balls.begin(), balls.end(),
[] (const Ball& el) { //write your condition here;})balls.end());
答案 3 :(得分:0)
首先在向量上调用erase()
时,类型的析构函数被调用的次数等于被擦除的元素数(C ++ 11 23.3.7.5.5)。擦除元素之后的所有元素都向前移动以占据空白区域。我们没有使用此操作恢复内存,因为我们没有更改容器的容量。
其次,您可以使用标准算法std::remove_if()和lambda来消除满足特定条件的元素。以下是一个如何运作的小例子:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> foo = {1,2,3,4,5,5,5,5,6,7,8,9};
std::remove_if(foo.begin(), foo.end(), [](int i){ if(i == 5) return true; else return false; });
for (const auto & e : foo)
std::cout << e << " ";
}