问题从c ++

时间:2017-11-05 15:24:32

标签: c++ iterator erase

我有以下代码:

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");

我用谷歌搜索它似乎与我的迭代器有关,但我不确定错误和迭代器之间的关系。

相反,如果我将_playerItems变量设为全局变量然后使用此全局变量开始/结束迭代器,则如果我使用以下代码iterator = player._playerItems.erase(iterator);

,则代码运行正常

修改

这是GetPlayerItems()函数

list<Item> Player::GetPlayerItems()
{
    return _playerItems;
} 

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

iteratorplayerItems的迭代器。目前还不清楚player.GetPlayerItems()返回什么(因为你忽略了显示它的定义甚至声明),但不管它是什么,playerItems是一个单独的,不同的列表 - GetPlayerItems()的副本返回。

然后,您尝试使用指向另一个的迭代器从一个列表中删除。这表现出未定义的行为 - someList.erase(iter)期望iter成为someList的有效迭代器。

答案 1 :(得分:0)

在这里,您尝试使用指向另一个的迭代器从一个列表中删除。

为什么不能使用iterator = playerItems.erase(iterator);而不是iterator = player.GetPlayerItems()。erase(iterator);在循环中。

为什么你试图使用get函数调用访问相同的列表(player.GetPlayerItems()),因为你已经有一个可用于同一列表的引用。