簡體   English   中英

C ++列表迭代器不兼容錯誤

[英]C++ list iterators incompatible error

我是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
}

我在這個周期中稱呼它。 在嘗試進行比較時, it != p.dejEntityEnd()在第一次迭代之前崩潰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 在此處輸入圖片說明

每個Prostredi::iterator對象都包含其自己唯一的std::list<Agent> 您只能比較來自同一std::list迭代器。 因此,即使p.dejEntityBegin() != p.dejEntityEnd()也是未定義的行為。

要解決看起來像您要解決的問題,您應該讓迭代器保存原始list<Agent>**rowscols以及一些當前位置索引,並弄清楚如何使用尊重那些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM