我正在尝试为一些具有两个迭代器的代码创建一个while循环,一个从列表的开头开始,然后递增,另一个在结束时开始并递减,希望它们一旦停止就停止到达列表的中间位置,整个列表已被覆盖。当我使用向量迭代器执行类似操作时,我只能执行while (limit > first)
,但这不起作用,并且在完成列表迭代器时会出现编译器错误。我正在研究一个书籍问题,除了两个给定的迭代器之外,还有一个任务要求是不在代码中分配任何新内存,并且无法确定如何正确地浏览列表元素。
答案 0 :(得分:4)
反向迭代器取消引用前一个元素而不是它们内部引用的元素(" base")。 (有关视觉说明,请参阅this image。)
这意味着如果你有:
auto forward = a_list.begin();
auto backward = a_list.rbegin();
您交替增加forward
和backward
,会有forward == backward.base()
的时间。您必须在递增每个迭代器之后对此进行测试,不是,否则它们可能会在测试之前相互交叉。
答案 1 :(得分:1)
您可以使用std::list::size:
#include <list>
using namespace std;
void handle(int v) { cout << v << endl; }
void main() {
list<int> l = { 1,2,3,4,5,6,7,8,9 };
auto f = l.cbegin();
auto r = l.crbegin();
const int stepsCount = l.size() / 2;
for (int i = 0; i < stepsCount; ++i) {
handle(*f); handle(*r);
f++; r++;
}
if (l.size() % 2) handle(*r);
}