迭代一个STL容器而不是.begin()ing并回绕

cat*_*eof 10 c++ iterator vector std

我有一个std :: vector,简单来说就是整数.

std::vector<int> ivec;
ivec.push_back(1);
ivec.push_back(2);
... //omitting some push back's 3 to 99
ivec.push_back(100);
Run Code Online (Sandbox Code Playgroud)

迭代的标准方法是已知的

std::map<int>::iterator it;
for( it = ivec.begin(); it != ivec.end(); it++ ) 
  print();
Run Code Online (Sandbox Code Playgroud)

该迭代将打印1,2,3,... 100.

我想从预定义索引开始遍历所有向量元素,而不是从it.begin()遍历.我想打印

3,4,5,6 ... 99,100,1,2

你能在这里分享你的想法吗?

它可以分两步完成

for( it = ivec.begin()+index; it != ivec.end(); it++ ) and then (if index !=0)

for ( it = ivec.begin; it = it = ivec.begin() + (index-1); it++)
Run Code Online (Sandbox Code Playgroud)

Emi*_*lia 7

你可以:

  • 开发一个迭代器类,它包装了vector :: iterator并公开你喜欢的行为(特别是:++检查end()并用begin()替换它并调整其他"边界值")

  • 填充从3开始的向量并在100处换行,以便标准迭代看起来如您所愿.

选择取决于向量的目的是什么,以及还需要什么迭代.

  • @PaulManta:如果问题是"本地化"是微不足道的.如果问题是"泛化的",如果不是微不足道的话:如果你希望你的迭代适用于任何现有的STL算法......你必须定义一个迭代器.我认为你的投票是基于偏见. (8认同)

jro*_*rok 3

bool wrapped = false;
for (auto it = vec.begin() + index; (it != vec.begin() + index) || !wrapped; ++it)
{
    if (it == vec.end())
    {
        it = vec.begin();
        wrapped = true;
    }
    std::cout << *it;
}
Run Code Online (Sandbox Code Playgroud)