我该如何删除矢量中的对象

时间:2015-07-14 18:19:20

标签: c++ visual-c++ vector

我正在创建一个使用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]吗?我是否永远不必担心撞锤上存在的球?

感谢所有帮助人员!

4 个答案:

答案 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 << " ";
}

Live Example