(請注意下面的編輯)
的爲範圍的循環不會給你訪問到內部迭代器。一方面,這很好,因爲你不能搞砸它。另一方面,這可能是不好的,因爲你需要迭代器來知道你在容器中的位置。因此,我們不能使用for-range循環作爲外部循環,除非您使用線性內存佈局迭代某些內容,您可以將某個項目的地址作爲迭代器。
此外,標準庫還沒有達到以方便的方式處理範圍的任務。我使用一些實用程序從像iterator_range
加速這個代碼片段:
using boost::make_iterator_range;
using std::next;
for (auto iter1 = container.begin(), ee = container.end(); iter1 != ee; ++iter1) {
auto& item1 = *iter1;
for (auto& item2 : make_iterator_range(next(iter1),ee)) {
// do something with item1 and item2
}
}
誠然,不是很漂亮。但是這給出了一種方法,給出一對迭代器如何使用for-range循環。基本上,範圍循環吃任何提供開始/結束功能的東西。 make_iterator_range
包裝了一對迭代器並返回一些東西,它提供了開始/結束函數。
編輯:我最近得知boost::irange
也可以產生迭代器序列(而不僅僅是數字序列)。考慮到這一點,看看這個程序:
#include <iostream>
#include <vector>
#include <boost/range/irange.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/range/adaptor/indexed.hpp>
int main()
{
using std::vector;
using std::next;
using boost::irange;
using boost::make_iterator_range;
namespace ba = boost::adaptors;
vector<double> x {1.1, 2.2, 3.3, 4.4, 5.5, 6.6};
for (auto iter1 : irange(begin(x),end(x))) {
auto& item1 = *iter1;
for (auto& item2 : make_iterator_range(next(iter1),end(x))) {
// do something with item1 and item2
std::cout << item1 << " < " << item2 << std::endl;
}
}
return 0;
}
我的C++ 0x模式與G ++ 4.6.3測試這和Boost 1.48和它的實際工作。
沒有迭代器,你不能這樣做。但是您可以避免放棄迭代整個集合的語法糖,請參閱[本答案](http://stackoverflow.com/a/14920606/2079303)。 – user2079303
謝謝,看起來很有趣。 –
@ user2079303添加它作爲答案,我會接受它。 –