集合上的无限循环

Infinite loop over collection

本文关键字:无限循环 集合      更新时间:2023-10-16

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

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

我想像1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1... 一样循环

当然有多种方法,但我想知道是否有一种标准/优雅的方法可以做到这一点。我查了<algorithm>,但什么也找不到。

谢谢。

没有绝对的标准方法。

我会这样写:

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

有几种方法可以做到这一点。正如@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 << ", ";
} 

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

等等。:)

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

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

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

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 << " " << ;
    }
}

您可以执行以下操作:

#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

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

将执行