std::list的循环迭代
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.end()
和container.begin()
返回的迭代器与传递给函数的迭代程序不同。相反,如果通过引用传递Container
,则代码工作正常。
实例
相关文章:
- 擦除while循环中迭代的元素
- 对于set上的循环-获取next元素迭代器
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 将多个 for 循环组合成单个迭代器
- 为什么我的 scanf() 没有在我的数组上迭代我的 for 循环?
- 使用一个 for 循环如何迭代和测试迭代器值?
- 循环挂起迭代的 std::擦除 on std::list
- 使用基于范围的循环迭代矢量时出现问题
- 整个循环花费的时间比其迭代总和要长
- 为什么"i"在循环的每次迭代中都没有增加?(C++)
- 转到基于范围的 for 循环中的下一个迭代器
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- C++ Code 在 for 循环期间不会累积变量中的总和,仅提供最终迭代值
- Visual Studio 2013 C 的迭代循环
- 矢量迭代循环引发错误
- C++:如何将数据从迭代循环输出到列中
- 迭代循环重复的次数比我预期的要多
- c++ 11线程在迭代循环时间
- 迭代循环与索引循环