我知道有类似的问题,但我没有设法找到我的代码的帮助下的方式。我只想删除/删除一个向量的元素,通过检查这个元素在一个循环内的属性。我该怎么做呢?我尝试了下面的代码,但我收到了模糊的错误消息:
"operator ="函数在"播放器"中不可用。
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属于同一个问题吗?我需要一个赋值运算符吗?为什么?
7条答案
按热度按时间zzzyeukh1#
您不应在
for
循环中递增it
:注意注解部分;这里不需要
it++
,因为it
在for-body本身中递增。关于错误“'operator =' function is available in 'Player'",这是由于使用了
erase()
,内部使用operator=
来移动vector中的元素,为了使用erase()
,类Player
的对象必须是可赋值的,这意味着需要为Player
类实现operator=
。无论如何,你应该尽可能地避免raw loop 1,而应该更喜欢使用算法来代替,在这种情况下,流行的Erase-Remove Idiom可以简化你正在做的事情。
1.这是我看过的the best talks by Sean Parent之一。
amrnrhlw2#
这是我删除向量中元素的方法,简单易懂,不需要任何技巧。
to94eoyn3#
忘记循环,使用标准或升压范围算法。
使用Boost.Range en Lambda,它看起来像这样:
b4qexyjb4#
您的特定问题是
Player
类没有赋值运算符。您必须使"Player"可复制或可移动才能将其从向量中删除。这是因为该向量需要连续,因此需要重新排序元素以填充删除元素时产生的间隙。还有:
使用标准算法
如果你有boost的话就更简单了
如果您不支持C++11 lambdas,请参阅TimW的答案。
jucafojl5#
或者倒着做。
ogq8wdun6#
C++11引入了一个新的函数集合,在这里会用到。
这样你就得到了一个好处,那就是不需要对末端元素做太多的移动。
zi8p0yeb7#
回答晚,但已看到低效变体:
std::remove
或std::remove_if
是要走的路。1.如果出于任何原因,这些是不可用的,或者因为任何其他原因而不能被使用,那么做这些对你隐藏的事情。
有效删除元素的代码:
您可能需要显式地编写这样的循环,例如,如果您需要迭代器本身来确定元素是否要被删除(条件参数需要接受对元素的引用,还记得吗?),例如,由于与后继者/前导者的特定关系(如果这种关系是相等的,那么存在
std::unique
)。