我是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
答案 0 :(得分:0)
每个Prostredi::iterator
对象都包含自己唯一的std::list<Agent>
。您只能比较来自同一std::list
的迭代器。所以即使p.dejEntityBegin() != p.dejEntityEnd()
是未定义的行为。
要解决问题,您似乎正在尝试解决问题,您应该让迭代器保留原始list<Agent>**
,rows
和cols
以及一些当前问题位置指数,并弄清楚如何增加/减少。