C ++是否存在循环列表的标准实现?

时间:2009-06-03 21:57:05

标签: c++ data-structures circular-list

我想使用循环列表。

没有实现我自己的(like this person did)我的选择是什么?

具体来说,我想做的是迭代一个对象列表。当我的迭代器到达列表的末尾时,它应该自动返回到开头。 (是的,我意识到这可能很危险。)

See Vladimir's definition of a circular_iterator:“circular_iterator永远不会与CircularList :: end()相等,因此你总是可以取消引用这个迭代器。”

4 个答案:

答案 0 :(得分:30)

没有标准的循环列表。

但是,Boost中有一个circular buffer,可能会有所帮助。

如果您不需要任何花哨的东西,您可以考虑使用vector并使用索引访问元素。您可以使用向量的大小mod索引,以获得与循环列表大致相同的内容。

答案 1 :(得分:17)

如果你想要一个看起来像迭代器的东西,你可以自己滚动,看起来像

template <class baseIter>
class circularIterator {
    private:
        baseIter cur;
        baseIter begin;
        baseIter end;
    public:
        circularIterator(baseIter b, baseIter e, baseIter c=b)
            :cur(i), begin(b), end(e) {}
        baseIter & operator ++(void) {++cur; if(cur == end) {cur = begin;}}
};

(其他迭代器操作留给读者练习。)

答案 2 :(得分:1)

list<int>::iterator circularNext(list<int> &l, list<int>::iterator &it)
{
    return std::next(it) == l.end() ? l.begin() : std::next(it);
}

答案 3 :(得分:0)

除了@ captain-segfault和@ mahmoud-khaled的以迭代器为重点的答案之外,您还可以通过更改从中检索元素的方式,将std::list用作循环列表。在处理列表时,使用splice将列表的一端移到另一端。

template <typename T>
T & circularFront(std::list<T> & l)
{
  l.splice(l.end(), l, l.begin());
  return l.back();
}
template <typename T>
T & circularBack(std::list<T> & l)
{
  l.splice(l.begin(), l, l.rbegin());
  return l.front();
}