c++ - 删除循环内 vector 的元素

标签 c++ vector erase

我知道有和这个类似的问题,但我没能在他们的帮助下找到我的代码的方法。我只想通过检查循环内此元素的属性来删除/删除 vector 的元素。我怎样才能做到这一点?我尝试了以下代码,但收到了模糊的错误消息:

'operator =' 函数在 'Player' 中不可用。

 for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++)
 {
     if(it->getpMoney()<=0) 
         it = allPlayers.erase(it);
     else 
         ++it;
 }

我该怎么办?

更新:你认为vector::erase with pointer member这个问题吗?属于同一个问题?因此我需要一个赋值运算符吗?为什么?

最佳答案

你不应该在 for 循环中递增 it:

for (vector<Player>::iterator it=allPlayers.begin(); 
                              it!=allPlayers.end(); 
                              /*it++*/) <----------- I commented it.
{

   if(it->getpMoney()<=0) 
      it = allPlayers.erase(it);
  else 
      ++it;
 }

注意注释部分;那里不需要it++,因为it 在for-body 本身中递增。

至于错误“'operator =' function is unavailable in 'Player'”,是由于内部使用了erase()的使用operator= 移动 vector 中的元素。为了使用erase(),类Player 的对象必须是可分配的,这意味着您需要为 实现operator=播放器类。

无论如何,你应该避免raw loop 1 尽可能多,应该更喜欢使用算法。在这种情况下,流行的 Erase-Remove Idiom可以简化您正在做的事情。

allPlayers.erase(
    std::remove_if(
        allPlayers.begin(), 
        allPlayers.end(),
        [](Player const & p) { return p.getpMoney() <= 0; }
    ), 
    allPlayers.end()
); 

1。它是 the best talks by Sean Parent 之一我看过的。

关于c++ - 删除循环内 vector 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43554673/

相关文章:

c++ - 如果 ptr 是指向静态数组第一个元素的 ptr,编译器将如何评估++*ptr++?

android - 如何向我的可绘制矢量资源添加标高/投影?

java - 如何初始化 org.apache.commons.math3.geometry.Vector?

c++ - 如何删除和删除指向 vector 中存储的对象的指针?

c++ - 从 vector 中删除 opencv rect 对象

c++ - _sleep() 在 C++ 中不起作用

java - 1bpp 图像中的简单形状检测

带类的 C++ 指针

c++ - 在 C++ 中通过指针和引用传递 vector

c++ - 有人可以解释为什么这个 vector 删除操作不能正常工作吗?