如何以无限方式迭代std :: vector?假设我有
std::vector<int> myvect {1, 2, 3, 4};
我想像1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1...
当然有多种方式,但我想知道是否有标准/优雅的方式来做到这一点。我已经查看了<algorithm>
,但我找不到任何东西。
感谢。
答案 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] );
会这样做