调试断言失败 - 向量迭代器不兼容

时间:2016-01-20 01:23:56

标签: c++ vector lambda iterator

我正在尝试比较来自同一向量的两个迭代器,但由于某种原因它给我这个错误:

这是相关的代码功能:

函数,它找到第一个迭代器并返回它的副本:

static const vector<Player*>::const_iterator findPlayer(
                    const vector<Player*> players, int id)
{ ///const
    vector<Player*>::const_iterator found
        = find_if(begin(players), end(players), [id] (Player* player) {
            return player->getId() == id;
        });
    return found;
}

这些是代码的比较:

vector<Player*>::const_iterator found = findPlayer(this->_players_in, *cur_id);
if(found != end(this->_players_in))

有人知道原因吗?

1 个答案:

答案 0 :(得分:2)

看起来你正在制作向量的副本,使用find_if将迭代器放入该副本,然后返回该迭代器。这很糟糕,因为迭代器指向的向量将在您返回时被销毁。

您应该通过引用传递玩家。您的声明应如下所示:

static const vector<player*>::const_iterator findPlayer(const vector<Player*>& players, int id)

(注意&amp;)

这可确保您返回的迭代器指向调用者提供的同一容器。

注意:这种断言不是标准的。为调试版本提供它是非常类似的编译器/环境。我在一些自定义容器的迭代器上实现了这些类型的检查,它至少节省了我十几次。