无限循环集合

时间:2014-04-11 10:55:17

标签: c++ c++11

如何以无限方式迭代std :: vector?假设我有

std::vector<int> myvect {1, 2, 3, 4};

我想像1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1...

一样循环播放

当然有多种方式,但我想知道是否有标准/优雅的方式来做到这一点。我已经查看了<algorithm>,但我找不到任何东西。

感谢。

7 个答案:

答案 0 :(得分:4)

没有绝对的标准方式。

我写的如下:

for(;;)   // the standard/traditional way to write "forever"
{
    for(auto x : myvect)  // the new way to iterate over a vector
    {
       //
    }
}

答案 1 :(得分:2)

有几种方法可以做到这一点。正如 @Debasish Jana 已经指出你可以写

while ( true )
{
   for ( int x : myvect ) std::cout << x << ", ";
}

我认为您不是std::vector<i> myvect {1, 2, 3, 4};而是std::vector<int> myvect {1, 2, 3, 4};

或者你可以写

for ( std::vector<int>::size_type i = 0; i < nyvect.size(); i = ( i + 1 ) % myvect.size() )
{
   std::cout << x << ", ";
} 

如果向量为空,则不会执行此循环。

依此类推。:)

答案 2 :(得分:1)

while (true) {
  // iterate myvect 
  for (int i=0; i<myvect.size(); i++) {
     std::cout << myvect[i] << ", ";
  }
}

答案 3 :(得分:1)

index = 0;
while(true)
{
    //Access your vector element using index
    index = ( index + 1 ) % length;
}

其中length是您拥有的元素总数。

答案 4 :(得分:0)

C ++:

std::vector<int> myvect {1, 2, 3, 4};
std::vector<int>::iterator vecIter = myvect.begin();
while(1){
    for(vecIter = myvect.begin();vecIter != myvect.end();++vecIter){
        std::cout << *vecIter << " " << ;
    }

}

C ++ 11X:

std::vector<int> myvect {1, 2, 3, 4};
while(1){
    for(int i :myvect){
        std::cout << i << " " << ;
    }

}

答案 5 :(得分:0)

您可以执行以下操作:

#include <iterator>

template<class Container> class ever_t {
  struct iterator {
    typename Container::iterator b, e, v;
    iterator& operator++() { ++v; if( v == e ) v = b; return *this; };
    iterator operator!() { return {b, e, e}; };
    bool operator!=(const iterator& o) { return b != o.b || e != o.e || v != o.v; };
    typename Container::iterator::reference operator*() { return *v; };
  } b;
public:
  ever_t(Container& c_) : b{std::begin(c_), std::end(c_), std::begin(c_)} {};
  iterator begin() { return b; }
  iterator end() { return !b; }
};

template<class Container> ever_t<Container> ever(Container& c) { return ever_t<Container>(c); }

#include <iostream>
#include <vector>

int main() {
  std::cout << "oi" << std::endl;
  std::vector<int> i { 1, 2, 3, 4 };
  std::vector<int> empty;

  for( auto x: ever(empty) ) { // never enters here
    std::cout << x << std::endl;
  }
  for( auto x: ever(i) ) {
    std::cout << x << std::endl;
  }
}

虽然除了过度杀伤之外,你最终还是需要一个break所以你的程序可以停止。 :d

答案 6 :(得分:0)

for(unsigned i=0;true;++i)
    do_something( myvect[i%4] );

会这样做