[英]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>**
, rows
和cols
以及一些當前位置索引,並弄清楚如何使用尊重那些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.