从 C++ 列表中删除元素的问题
Issue erasing an element from a list in c++
我有以下代码:
list<Item> playerItems = player.GetPlayerItems();
list<Item>::iterator iterator;
for (iterator = playerItems.begin(); iterator != playerItems.end(); ++iterator)
{
if (itemToSell == (*iterator).GetName())
{
if ((*iterator).GetCost() < GetShopGold())
{
SetShopItem(*iterator);
SetShopGold(GetShopGold() - (*iterator).GetCost());
player.SetPlayerGold(player.GetPlayerGold() + (*iterator).GetCost());
//The issue is here
iterator = player.GetPlayerItems().erase(iterator);
return true;
}
else
{
cout << "I can't afford that..." << endl;
}
}
}
这是 RemovePlayerItem 代码:
void Player::RemovePlayerItem(list<Item>::iterator& iterator)
{
iterator = _playerItems.erase(iterator);
}
当我 运行 代码时,出现以下错误:
_DEBUG_ERROR("list erase iterator outside range");
我google了一下,好像和我的迭代器有关,但是我不确定错误和迭代器的关系。
相比之下,如果我将 _playerItems 变量设为全局变量,然后 start/end 迭代器使用此全局变量,则代码 运行 如果我使用以下代码 iterator = player._playerItems.erase(iterator);
就没问题]
编辑
这是 GetPlayerItems() 函数
list<Item> Player::GetPlayerItems()
{
return _playerItems;
}
谁能用这个给我指出正确的方向?
iterator
是 playerItems
的迭代器。目前尚不清楚 player.GetPlayerItems()
returns 是什么(因为您忽略了显示其定义甚至声明),但无论它是什么,playerItems
都是一个单独的、不同的列表 - GetPlayerItems()
返回。
然后您尝试使用指向另一个列表的迭代器从一个列表中删除。这表现出未定义的行为 - someList.erase(iter)
期望 iter
成为 someList
.
的有效迭代器
此处您正尝试使用指向另一个列表的迭代器从一个列表中删除。
为什么不能使用iterator = playerItems.erase(iterator);而不是 iterator = player.GetPlayerItems().erase(iterator);在循环内。
为什么您尝试使用 get 函数调用 (player.GetPlayerItems()) 访问同一个列表,因为您已经有对同一个列表的引用。
我有以下代码:
list<Item> playerItems = player.GetPlayerItems();
list<Item>::iterator iterator;
for (iterator = playerItems.begin(); iterator != playerItems.end(); ++iterator)
{
if (itemToSell == (*iterator).GetName())
{
if ((*iterator).GetCost() < GetShopGold())
{
SetShopItem(*iterator);
SetShopGold(GetShopGold() - (*iterator).GetCost());
player.SetPlayerGold(player.GetPlayerGold() + (*iterator).GetCost());
//The issue is here
iterator = player.GetPlayerItems().erase(iterator);
return true;
}
else
{
cout << "I can't afford that..." << endl;
}
}
}
这是 RemovePlayerItem 代码:
void Player::RemovePlayerItem(list<Item>::iterator& iterator)
{
iterator = _playerItems.erase(iterator);
}
当我 运行 代码时,出现以下错误:
_DEBUG_ERROR("list erase iterator outside range");
我google了一下,好像和我的迭代器有关,但是我不确定错误和迭代器的关系。
相比之下,如果我将 _playerItems 变量设为全局变量,然后 start/end 迭代器使用此全局变量,则代码 运行 如果我使用以下代码 iterator = player._playerItems.erase(iterator);
就没问题]
编辑
这是 GetPlayerItems() 函数
list<Item> Player::GetPlayerItems()
{
return _playerItems;
}
谁能用这个给我指出正确的方向?
iterator
是 playerItems
的迭代器。目前尚不清楚 player.GetPlayerItems()
returns 是什么(因为您忽略了显示其定义甚至声明),但无论它是什么,playerItems
都是一个单独的、不同的列表 - GetPlayerItems()
返回。
然后您尝试使用指向另一个列表的迭代器从一个列表中删除。这表现出未定义的行为 - someList.erase(iter)
期望 iter
成为 someList
.
此处您正尝试使用指向另一个列表的迭代器从一个列表中删除。
为什么不能使用iterator = playerItems.erase(iterator);而不是 iterator = player.GetPlayerItems().erase(iterator);在循环内。
为什么您尝试使用 get 函数调用 (player.GetPlayerItems()) 访问同一个列表,因为您已经有对同一个列表的引用。