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

Run*_*ble 23 c++ circular-list data-structures

我想使用循环列表.

没有实施我自己(像这个人一样)我的选择是什么?

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

请参阅Vladimir对a的定义circular_iterator:"circular_iterator永远不会与CircularList :: end()相等,因此您始终可以取消引用此迭代器."

Naa*_*aff 30

没有标准的循环列表.

但是,Boost中有一个循环缓冲区,可能会有所帮助.

如果您不需要任何花哨的东西,您可以考虑使用a vector并使用索引访问元素.您可以mod使用向量大小的索引来实现与循环列表大致相同的操作.

  • 谢谢Naaff!使用向量的大小修改索引是一个简单的解决方案,我很尴尬,我没有想到它. (4认同)
  • 如果您确保 `vector` 的大小是 2 的幂,那么不要使用模运算的昂贵开销,而是使用按位 `&` 运算符,因为它只需要一个周期。它的工作原理是这样的:`(n mod (2^k)) == (n & (2^k - 1))` 例如`n % 256 == (n & (255))` (2认同)
  • 无论如何,编译器都会在适合您的情况下用位操作替换 mod,除非您确实需要未优化的调试性能,否则无需混淆代码 (2认同)

Cap*_*ult 18

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

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;}}
};
Run Code Online (Sandbox Code Playgroud)

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


Mah*_*led 5

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