[英]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:將其傳遞給0
和r.size()
然后從0
計數到size()-1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.