繁体   English   中英

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 这将导致一个副本,因此container.end()container.begin()返回的迭代器与传递给函数的迭代器并不相同。 相反,如果您通过引用传递Container ,则代码可以正常工作。

现场例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM