[英]Circular iteration of std::list
在我的应用程序中,我需要具有以下能力:从列表的任意成员开始遍历双向链表,并持续经过end(),然后环绕到begin()并继续直到遍历到达起点为止。
我决定将std::list
用于底层数据结构,并编写了一个circulate
例程来实现此目的。 但是,当它从end()到begin()换行时,显示出某些意外行为。 这是我的实现
template <class Container, class BiDirIterator>
void circulate(Container container, BiDirIterator cursor,
std::function<void(BiDirIterator current)> processor)
{
BiDirIterator start = cursor;
do {
processor(cursor);
cursor++;
if (cursor == container.end()) {
cursor = container.begin(); // [A]
}
} while (cursor != start);
}
// ...
typedef int T;
typedef std::list<T> TList;
typedef TList::iterator TIter;
int count = 0;
TList l;
l.push_back(42);
circulate<TList, TIter>(
l, l.begin(),
[&](TIter cur) {
std::cout << *cur << std::endl;
count++;
}
);
输出为:
42
-842150451
当我单步执行代码时,我发现从未到达标有[A]的行。 游标从不等于container.end()
。 令人惊讶的是,在该游标上调用++
,在下一遍将其自动带到container.begin()
。 (我想这是特定于此STL实现的)。
如何解决此问题?
这里的问题是您Container
值来获取Container
。 这将导致一个副本,因此container.end()
和container.begin()
返回的迭代器与传递给函数的迭代器并不相同。 相反,如果您通过引用传递Container
,则代码可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.