Время от времени мне нужно перебирать подмножество элементов контейнера или просто извлекать их и пренебрегать остальными. В итоге я создал boost::range::adaptors::filtered
, чтобы создать эти ленивые коллекции.C++ собирает алгоритм?
for(auto&& i : container | filtered(predicate)) {
// .. do stuff
}
Есть ли причина отсутствия сборного алгоритма (как в Руби сбор) в STL (у нас есть только copy_if, не одно и то же)? Или любая причина против использования?
Возможная реализация может быть:
template<class Container, class Predicate>
Container collect(Container&& c, Predicate&& p) {
Container n;
for(auto&& i : c) {
if(p(i)) {
n.push_back(i);
}
}
return n;
}
но lazy_collect
также может быть полезно, чтобы избежать копирования.
Все ответы ниже являются замечательными. Хотел бы я отметить всех. Я не знал о std::back_inserter
. Сбор вещей теперь так же просто, как:
boost::copy(orig | filtered(predicate), std::back_inserter(collection));
Возможно, вы ищете 'std :: copy_if()', определенный в ''? –
Angew
@ Кажется, что вы указали, что вы добавили, что 'copy_if' не то же самое. При использовании 'copy_if' вам нужно заранее знать, сколько места вам нужно, в результате чего' n container (count_if (старый, предикат)); станд :: copy_if (старый, п, сказуемое); '. – gnzlbg
Как показывает мой asnwer, вы можете использовать 'back_inserter', чтобы обойти требования знания размера apriori. – Angew