C ++列表迭代器不兼容错误

时间:2016-11-15 18:48:29

标签: c++ list iterator

我是C ++中迭代器的新手,我遇到了不兼容迭代器的问题。我已经花了5个多小时,但仍然无法弄清楚为什么它不兼容或我做错了什么。我敢肯定,我搞砸了迭代器的操作员或接近它的东西。

迭代器标题

class iterator : public std::iterator < std::input_iterator_tag, Agent > {
    list<Agent> agentList;
    list<Agent>::iterator it;
public:
    iterator(list<Agent>** env, int rows, int cols);
    void operator ++(int);
    bool operator ==(const iterator& a) const;
    bool operator !=(iterator& a) const;
    Agent& operator*();
};

迭代器实现

Prostredi::iterator::iterator(list<Agent>** env, int rows, int cols) {
    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            for (list<Agent>::iterator it = env[r][c].begin(); it != env[r][c].end(); it++) {
                agentList.push_front(*it);
            }
        }
    }
    it = agentList.begin();
}

void Prostredi::iterator::operator++(int) {
    it++;
}

Agent& Prostredi::iterator::operator*() {
    return *it;
}

bool Prostredi::iterator::operator== (Prostredi::iterator& a) const {
    return !(it != a.it);
}

bool Prostredi::iterator::operator!= (Prostredi::iterator& a) const {
    return a.it != it; // Here it crashes
}

我在这个for-cycle中调用它。在尝试比较it != p.dejEntityEnd()时,它在第一次迭代之前崩溃。

void Stav::napln(const Prostredi & p) {
    for (auto it = p.dejEntityBegin(); it != p.dejEntityEnd(); it++) {
        agenti.push_back((*it).vypocitejNovyStav(p));
    }
}

Prostredi::iterator Prostredi::dejEntityBegin() const {
    return Prostredi::iterator(env, rows, cols);
}

Prostredi::iterator Prostredi::dejEntityEnd() const {
    Prostredi::iterator it = Prostredi::iterator(env, rows, cols);
    Prostredi::iterator::it = agentList.end();
    return it;
}

Project有几个类和头文件,所有内容对于正确设置都是必不可少的,因此在不留下重要信息的情况下很难抽象出问题。如果您需要更多信息,我很乐意回复,或者您可以在此处获取我的完整项目(断点已设置):https://www.dropbox.com/sh/9lsle7seiqz2wgj/AABJAXRXo350AhVmm-OqRSOqa enter image description here

1 个答案:

答案 0 :(得分:0)

每个Prostredi::iterator对象都包含自己唯一的std::list<Agent>。您只能比较来自同一std::list的迭代器。所以即使p.dejEntityBegin() != p.dejEntityEnd()是未定义的行为。

要解决问题,您似乎正在尝试解决问题,您应该让迭代器保留原始list<Agent>**rowscols以及一些当前问题位置指数,并弄清楚如何增加/减少。