将圆形缓冲器移位/对齐/旋转到原位为零

joz*_*yqk 13 arrays algorithm list circular-buffer

我正在使用循环缓冲区将数据推送到列表的任何一端.在我完成之后,我想对齐缓冲区,使列表中的第一个元素位于零位置,并且可以像常规数组一样使用,而不需要任何花哨的索引开销.

所以我有我的循环list容量N,它有n从任意索引开始的元素f.

在此输入图像描述

移动/旋转所有元素的最快方法是f = 0什么?

问题是我想要就地做到这一点(当然,当然需要一些寄存器/临时工).缓冲区可能是full(n = N),[ EDIT ],但我也有兴趣有效地处理它几乎为空的情况.

Vau*_*ato 8

std::rotatecplusplus.com上的实现中获取的算法非常好:

template <class ForwardIterator>
  void rotate (ForwardIterator first, ForwardIterator middle,
               ForwardIterator last)
{
  ForwardIterator next = middle;
  while (first!=next)
  {
    swap (*first++,*next++);
    if (next==last) next=middle;
    else if (first==middle) middle=next;
  }
}
Run Code Online (Sandbox Code Playgroud)

http://www.cplusplus.com/reference/algorithm/rotate/

  • +1非常好:)我发现在后面和前面之间的缓冲区中可能有很多空槽,不需要旋转.我已经对此进行了调整,并提出了一个早期的答案. (2认同)