【问题标题】:Iterator over a list pointing to wrong elements指向错误元素的列表的迭代器
【发布时间】:2013-12-05 19:55:38
【问题描述】:

我有 2 个变量:std::list lst;std::list<A*>::iterator lstiter,其中 A 是一个类。 lst 充满了指向类的指针! B 是另一个包含这两个变量的类。

将迭代器放在列表的开头:

void B::iterstart() {
lstiter = lst.begin();
}

void B::iternext() { 
iteratend();
lstiter = ++lstiter;
}

void B::iterprev() {
iteratstart(); 
lstiter = --lstiter;
}
void B::iteratend() {
 if (lst.empty())
    throw -1;
if (lstiter == lst.end()) 
    throw "Error: end of list\n"; 
}

void B::iteratstart() {
if (lst.empty())
     throw -1; 
if (lstiter == lst.begin())
    throw "Error: begin of list\n"; 
}

(我还有一个函数可以获取列表中迭代器指向的元素的指针。当列表中没有元素并且我尝试越过最后一个或第一个元素。这就是我的问题所在! 现在我打电话给:iterstart(); iternext(); iternext(); iternext();我从来没有收到消息!(列表结束)

而且我也确实有一些其他的错误,有时我调用过程 prev,但我得到了过程的返回值 next! (但我想先尝试解决其他问题)

【问题讨论】:

  • 那么,B 到底是什么?还是questionsquestions 是否与 lstiter 相关?
  • 哦抱歉,问题必须是列表,B 是一个包含迭代器和列表的类!

标签: c++ list iterator


【解决方案1】:

这个lstiter = ++lstiter 是错误的。使用整数它可能会工作,但当与复杂的 C++ 对象一起使用时,它并不总是正确执行,因为它取决于增量和复制函数的特定实现。另外,你为什么要这样做?您只需要++lstiter

【讨论】:

  • 我明白了!但是我仍然遇到了 iternext 函数的问题!会不会是迭代中的测试不正确?
  • @user2321611:是的,您应该进行增量,然后检查是否等于结束。您不能取消引用等于 end() 的迭代器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
相关资源
最近更新 更多