如何以循环方式在容器 (vector) 中实现循环遍历的最佳方法?

4
我需要以循环方式遍历一个容器,使得每次迭代都可以访问当前元素和前一个元素。对于第一次迭代,前一个元素应该是容器的back元素。
以下示例实现了这个功能:
#include <vector>
#include <iostream>

using namespace std;

int main(int argc, const char *argv[])
{
    vector<int> v = {0,1,2,3,4,5,6}; 

    auto xPreviousIt = v.end(); 
    --xPreviousIt; 

    int i = 0; 
    for (auto xCurrent : v)
    {
        cout << xCurrent <<  "  " << *xPreviousIt << endl; 
        xPreviousIt = v.begin() + i;  
        ++i; 
    }

    return 0;
}

但我想知道是否有更好的方式来实现这样的功能?比如一个循环迭代器,从容器的开头开始,并以那里结束?在boost中我能找到的只有circular buffer


2
编写一个迭代器,它包装了原始迭代器对,并带有一些额外的开销,这当然是可以做到的。 - Karoly Horvath
3
Boost::circular_buffer听起来是您想要的。它有什么不符合您的目标呢? - Zac Howland
@ZacHowland:我脑海中首先想到的是,我没有固定的存储空间,而是有可变的存储空间。当应用特定算法时,容器中存储的元素数量会发生变化。 - tmaric
@KarolyHorvath:我会尝试这个,也许:我还不知道有多少算法需要循环。 - tmaric
1
@tomislav-maric boost::circular_buffer 在运行时是固定的,而不是在编译时。如果您想要为不同的算法使用更大的缓冲区,只需通过将更大的参数传递到构造函数中创建一个具有更大大小的缓冲区即可。由于std::vector(可能)在添加项目时必须重新分配内存,因此当您想要更大的大小时,重建缓冲区并复制元素实际上并没有什么不同。 - Zac Howland
显示剩余2条评论
1个回答

3

使用普通的for循环更为简单。例如,如果init是起始索引,则可以编写如下代码:

for ( std::vector<int>::size_type i = 0; i < v.size(); i++ )
{
   std::cout << v[( init + i ) % v.size()] << ' ';
}

std::cout << std::endl;

4
我同意,单次使用会更简单。但如果您经常这样做,可能需要将迭代与实际工作解耦。这样做还有一个额外的好处,您可以使用算法。 - Karoly Horvath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接