主要通過兩種途徑:
1)您的評論說上面寫指着)的結果爲迭代器的容器(迭代器的東西。那將是這個樣子:
template <typename ForwardIterator, typename OutputIterator, typename UnaryPredicate>
void select_iterators(ForwardIterator first, ForwardIterator last,
OutputIterator out, UnaryPredicate pred) {
while (first != last) {
if pred(*first) *out++ = first;
++first;
}
}
然後你把它想:
vector<Foo> myfoos;
vector<vector<Foo>::iterator> results;
select_iterators(myfoos.begin(), myfoos.end(), std::back_inserter(results), some_comparator);
其實你可以在其它的算法來定義select_iterators
,使用copy_if
和boost::counting_iterator
,但我不認爲當直接實施如此簡單時,這是值得的。它看起來像:
template <typename ForwardIterator, typename OutputIterator, typename UnaryPredicate>
void select_iterators(ForwardIterator first, ForwardIterator last,
OutputIterator out, UnaryPredicate pred) {
std::copy_if(
boost::make_counting_iterator(first),
boost::make_counting_iterator(last),
out,
[&](ForwardIterator it) { return pred(*it); }
);
}
2)替代了前測試所有的價值觀和地方將結果寫的,定義每次遞增,直到找到下一場比賽的時間比原先的範圍內推進的迭代器。 Boost提供了兩種這樣做的方式,boost::filter_iterator
和boost::adaptors::filter
。所以,你可以寫:
auto results = boost::adaptors::filter(myfoos, some_comparator);
那麼無論你想與你的結果,這樣做,你可以遍歷從results.begin()
到results.end()
就好像它是一個容器。它不是一個容器,它不能滿足整個容器的界面。它滿足由Boost定義的名爲Range的接口,該接口相當於「可以迭代」。它實際上只是myfoos
的過濾視圖,因此沒有Foo
對象被複制或移動。
如果子集不是連續的子範圍,該怎麼辦? –
標準庫中沒有這樣的東西。 一個選項是boost :: Range,特別是[boost :: range :: filtered](http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference /adaptors/reference/filtered.html) – NicholasM
@KerrekSB輸出元素應該是最常見的,不是連續的 –