我知道这个问题有类似的问题,但我没有设法通过他们的帮助找到我的代码.我只想通过检查循环内该元素的属性来删除/删除向量的元素.我怎样才能做到这一点?我尝试了以下代码,但收到了错误的模糊消息:
'operator ='功能在'播放器'中不可用.
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++)
{
if(it->getpMoney()<=0)
it = allPlayers.erase(it);
else
++it;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
更新:你认为带有指针成员的问题vector :: erase是否属于同一个问题?我需要一个赋值运算符吗?为什么?
Naw*_*waz 117
你不应该it在for循环中增加:
for (vector<Player>::iterator it=allPlayers.begin();
it!=allPlayers.end();
/*it++*/) <----------- I commented it.
{
if(it->getpMoney()<=0)
it = allPlayers.erase(it);
else
++it;
}
Run Code Online (Sandbox Code Playgroud)
注意评论部分; it++在那里不需要,因为it在身体本身中增加了.
至于错误" 'operator ='函数在"播放器"中不可用 ",它来自erase()内部用于operator=移动向量中元素的用法.为了使用erase(),类的对象Player必须是可赋值的,这意味着你需要operator=为Player类实现.
无论如何,你应该尽可能地避免原始循环1,而应该更喜欢使用算法.在这种情况下,流行的Erase-Remove Idiom可以简化你正在做的事情.
allPlayers.erase(
std::remove_if(
allPlayers.begin(),
allPlayers.end(),
[](Player const & p) { return p.getpMoney() <= 0; }
),
allPlayers.end()
);
Run Code Online (Sandbox Code Playgroud)
这是我见过的肖恩家长最好的演讲之一.
小智 13
if(allPlayers.empty() == false) {
for(int i = allPlayers.size() - 1; i >= 0; i--) {
if(allPlayers.at(i).getpMoney() <= 0) {
allPlayers.erase( allPlayers.begin() + i );
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我删除向量中元素的方法.这很容易理解,也不需要任何技巧.
Tim*_*imW 10
忘记循环并使用std或boost范围algorthims.
使用Boost.Range和Lambda它看起来像这样:
boost::remove_if( allPlayers, bind(&Player::getpMoney, _1)<=0 );
Run Code Online (Sandbox Code Playgroud)
您的具体问题是您的Player班级没有赋值运算符.您必须使"播放器"可复制或移动,以便将其从矢量中移除.这是因为向量需要是连续的,因此需要重新排序元素以填充删除元素时创建的间隙.
也:
使用std算法
allPlayers.erase(std::remove_if(allPlayers.begin(), allPlayers.end(), [](const Player& player)
{
return player.getpMoney() <= 0;
}), allPlayers.end());
Run Code Online (Sandbox Code Playgroud)
如果你有提升,甚至更简单:
boost::remove_erase_if(allPlayers, [](const Player& player)
{
return player.getpMoney() <= 0;
});
Run Code Online (Sandbox Code Playgroud)
如果你不支持C++ 11 lambdas,请参阅TimW的答案.
| 归档时间: |
|
| 查看次数: |
76253 次 |
| 最近记录: |