for (auto enemy : this->enemies)
{
if (enemy->getHP() <= 0)
{
enemies.erase(enemy);
}
}
我有一個enemies包含多個Enemy*元素的向量,如果敵人的 hp 為 0 或更低,我想清除他們
我寫了上面的代碼,它給了我這個錯誤資訊:
No instance of overloaded function "std::vector<_Ty, _Alloc>::erase [with _Ty=Enemy *, _Alloc=std::allocator<Enemy *>]" matches the argument list
argument types are: (Enemy*)
object type is: std::vector<Enemy*,std::allocator<Enemy*>>
我認為這不是正確的方法,那怎么辦?
我是stackoverflow的新手,我還在學習英語,如果我犯了錯誤,我很抱歉
編輯:
這是我幾乎完整的代碼:
struct enemyType
{
public:
int type;
sf::Vector2f pos;
}
std::vector<std::vector<enemyType>> enemyList = {
{
{ trashMonster, sf::Vector2f(5.f * 16, 18.f * 16) }
}
}
std::vector<Enemy*> enemies;
std::vector<Enemy*>* GetEnemy(int level)
{
for (int i = 0; i < enemyList[level].size(); i )
{
switch (enemyList[level][i].type)
{
case trashMonster:
n_TrashMonster->setPosition(enemyList[level][i].pos);
enemies.emplace_back(n_TrashMonster);
break;
default:
std::cout << "Error to get an enemy\n";
break;
}
}
return &enemies;
}
//Code in different file
std::vector<Enemy*> enemies;
this->enemies = *GetEnemy(lvl);
for (auto enemy : this->enemies)
{
enemy->update(player->getCollisionBox());
//collision enemies to tilemap
collision::MapCollision(*this->map.getTilesCol(), *enemy);
if (enemy->getHP() <= 0)
{
enemies.erase(enemy);
}
}
沒有包括在內,因為我的代碼完全一團糟,所以我擔心人們不會明白我的問題的重點,這是我在這里的第一個問題
uj5u.com熱心網友回復:
該std::vector<T>::erase函式沒有erase(T a)多載。如果你想從 a 中洗掉元素,vector你不能像那樣迭代它們。我建議一個傳統的回圈。
for (size_t i=0; i<this->enemies.size(); i){
if (this->enemies[i]->getHP()){
std::swap(enemies[i],enemies::back());
delete enemies::back();//Only if you don't free the space elsewere
enemies.pop_back();
}
}
編輯:這會打亂向量的順序。如果您不希望這樣,您可以使用erase(enemies.begin() i)i 而不是將其交換回來并洗掉它
uj5u.com熱心網友回復:
使用 STL 容器時,通常您甚至不需要(顯式)for 回圈。像這樣使用 std::remove_if
#include <vector>
#include <algorithm>
#include <iostream>
class Enemy
{
public:
// not explicit on purpose, so I can initalize vector more quickly (in real code you should have explicit constructors if they have one argument of a different type)
Enemy(int hp) :
m_hp{ hp }
{
};
int getHP() const noexcept
{
return m_hp;
}
int m_hp;
};
int main()
{
// create a test vector with enemies with given hitpoints
std::vector<Enemy> enemies{ 1,2,0,4,5,6,0,7,8 };
// boolean lambda function that determines if an enemy is dead.
auto enemy_is_dead = [](const Enemy& enemy) { return enemy.getHP() <= 0; };
// use remove_if (this will move all the items to be removed to the end
auto remove_from = std::remove_if(enemies.begin(), enemies.end(), enemy_is_dead );
// then shrink the vector
enemies.erase(remove_from, enemies.end());
for (const auto& enemy : enemies)
{
std::cout << enemy.getHP() << " ";
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/516824.html
標籤:C 指针向量stl擦除
下一篇:C通過參考改變結構屬性
