2013-02-04 107 views
2

有沒有喜歡的std :: for_each的直接傳遞,而不是迭代器解引用的這些結果的功能?的std :: for_each的相當於是不取消引用迭代器

我們有什麼

std::vector<int> ints; 
std::for_each(ints.begin(), ints.end(), 
[](int i) 
{ 
    //how to get the iterator of this element??? 
} 

什麼我尋找

for_each_iterator(ints.begin(), ints.end(), 
[](const std::vector<int>::const_iterator &i) 
{ 
    //we know the iterator here 
} 

當然是相當瑣碎寫這樣的功能,但我問是否存在從std::的標準解決方案,std::tr1::boost::

+5

你會用它來做什麼? –

+0

我跑過這幾次。目前我正試圖壓縮兩個迭代器來比較它們所代表的範圍(而不是它們指向的值)。這是爲了單元測試的目的。 – Nobody

+0

*除非*迭代器本身就是元素,否則「遍歷迭代器」的想法聽起來有點矛盾。 –

回答

3

有一個在標準庫中沒有這樣的事情。但它並不難實現它自己:

template<typename It, typename Functor > 
void iterate(It begin, It end, Functor && f) 
{ 
    while (begin != end) { f(begin); ++begin; } 
} 

而且使用它作爲:

iterate(ints.begin(), ints.end(), [](std::vector<int>::iterator it) 
       { 
       //use it 
       }); 

或者使用手動循環。

+0

呃...函數應該可能是* universal-reference *。除此之外,我看不到任何良好的功能用例:) –

+0

@DavidRodríguez-dribeas:我編輯它。但我不知道爲什麼通過通用參考接受更好?它有什麼區別? – Nawaz

+0

不只是避免複製(它不會),但是你可以傳遞一個有狀態的對象,它會更新對象。請注意,這與標準中的'std :: for_each'的行爲不同,但也更靈活。 –

4

您正在尋找在錯誤的抽象水平。所述for_each算法將該函數應用於每個元件範圍的。如果您需要在迭代器進行操作,你應該展開你的循環:

for (auto it = ints.begin(); it != ints.end(); ++it) { 
    // do something 
} 

你所要求的是平凡實現的,只是沒有在我看來是有用的。要麼控制迭代器在循環中的更新方式(如上面的代碼中所示),要麼對迭代器本身沒有多大用處。你想從迭代器中取出什麼?

+1

你剛剛改寫他的問題 – qdii

+0

@qdii:最後一部分也許,但第一句話是正確的,而不是問題:他正在看錯誤的抽象層次。 –

1

我只能想到如何使用迭代器的包裝,我想不出只使用標準算法的方式,所以你仍然需要編寫一些輔助代碼。例如:

#include <algorithm> 
#include <vector> 
#include <iostream> 

template<typename T> 
struct it_wrapper { 
    it_wrapper(const T& t) : it(t) { } 

    T operator*() const { 
     return it; 
    } 

    it_wrapper& operator++() { 
     ++it; 
     return *this; 
    } 

    it_wrapper operator++(int) { 
     it_wrapper old = *this; 
     ++it; 
     return old; 
    } 

    bool operator!=(const it_wrapper& rhs) { 
     return it != rhs.it; 
    } 

    T it; 
}; 

template<typename T> 
it_wrapper<T> wrap(const T& t) { 
    return it_wrapper<T>(t); 
} 

int main() { 
    std::vector<int> v { 1, 2, 3, 4 }; 

    std::for_each(wrap(v.begin()), wrap(v.end()), [](decltype(v.begin()) i) { 
     std::cout << *i << '\n'; 
    }); 
} 

打印

我不知道這是如何多個H不僅僅是使用for -loop,但你必須有你的理由elpful ...

+0

我也想過這個。對於這位間接者,能否有一個標準解決方案(如我的問題所述)? – Nobody

+0

@我沒有人知道,除非你想用迭代器填充一個向量並遍歷該向量,這會很浪費。這是一種智力鍛鍊,還是你真的反對編寫課程和「循環」? –

+0

如果我不得不挑選那麼我會說後者。去年,我意識到2/3的代碼已經作爲標準解決方案存在,所以我現在試着避免這種情況。 – Nobody