簡體   English   中英

如何在范圍內為for循環更改(向前/向后移動)迭代器?

[英]How to change (move forward/backward) an iterator in range based for loop?

我只想獲取下一個迭代中的元素(使用基於范圍的for循環)

我已經嘗試過類似的方法:

*(&x + 1)應該表示“ i + 1”,前提是“ i”在這里是迭代器

bool factorChain(std::vector<int> arr) {
    for(auto& x : arr)
    {
        if (*(&x+1)%x != 0) return false;
    }
    return true;
}

我希望它像那樣工作,但要使用基於范圍的for循環:

bool factorChain(std::vector<int> arr) {
    for(int i=0; i<arr.size()-1; i++)
    {
        if(arr[i+1]%arr[i]!=0) return false;
    }
    return true;
}

或者這可能會更有用:

bool factorChain(std::vector<int> arr) {
    for(std::vector<int>::const_iterator iter = arr.begin();
          iter != arr.end()-1; ++iter){
        if(*(iter+1)%*(iter)!=0) return false;
    }
    return true;
}

如果您真的想使用基於范圍的循環,則可以執行以下操作:

bool factorChain(std::vector<int> arr) {
    int* prev = nullptr;
    for(auto& x : arr)
    {
        if (prev && x % *prev != 0) return false;
        prev = &x;
    }
    return true;
}

但是,在這一點上,僅拼寫出基於迭代器或基於索引的循環,而不是嘗試挽救基於范圍的循環,可能更清晰,更易讀。


現在,對於額外的細微之處,如何處理這樣的事情:

bool factorChain(std::vector<int> arr) {
    return std::adjacent_find(arr.begin(), arr.end(),
        [](int prev, int next) { return next % prev != 0; })
    == arr.end();
}

我只想獲取下一個迭代中的元素(使用基於范圍的for循環)

您的問題的答案很簡單:不要濫用功能。 range-for循環適用於最簡單的情況,其中您想一次遍歷數組。 如果要對遍歷進行細粒度控制,請不要使用range-for循環。 最后兩種方法都很好,所以不要過於復雜。

順便說一句,應通過const引用傳遞arr以避免不必要的復制。

一般來說,您不能。

我已經編寫了iterators_of ,它是一個范圍適配器,它接受一個范圍並使迭代器范圍變大。

您從范圍類型開始:

template<class It>
struct range{
  It b,e;
  It begin()const{return b;}
  It end()const{return e;}
};

那是最小的。

然后是索引迭代器:

template<class T>
struct indexing_iteratoid{
  using this_t=indexing_iteratoid;  
   T t;
   T operator*()const{return t;}
   void operator++()&{++t;}
   friend bool operator==(this_t const& lhs, this_t const& rhs){return lhs.t==rhs.t;}
   friend bool operator!=(this_t const& lhs, this_t const& rhs){return lhs.t!=rhs.t;}
};

再次,最小和剝離。

template<class R>
auto iterstors_of(R&& r){
  using std::begin; using std::end;
  auto b=begin(r), e=end(r);
  return range{ indexing_iteratoid{ b },  indexing_iteratoid{ e } };
}

現在您可以:

for(auto it:iterators_of( vec ) ){
}

*it是一個元素, *std::next(it)是下一個元素(請注意不要結束),等等。

代碼基於有效的代碼,但這是在電話上鍵入的,而且概率有tpyos。

因為它不是迭代器,所以它是一個Iteratoid。 它只適合for(:)循環。

它正在建立索引,因為它的主要用途是存儲size_t:將其傳遞給0r.size()然后從0計數到size()-1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM