Вы можете фильтровать элементы вашего входного контейнера, используя boost::filter_iterator
:
#include <boost/iterator/filter_iterator.hpp>
#include <queue>
#include <vector>
int main() {
using namespace std;
vector<int> vi={1,2,3,4,5,6,7,8,9,0};
auto filter = [](int a) { return a > 5; };
priority_queue<int, vector<int>, greater<int>> pq(
boost::make_filter_iterator(filter, vi.begin(), vi.end()),
boost::make_filter_iterator(filter, vi.end(), vi.end())
);
}
В качестве альтернативы, используйте boost :: range library с меньшим количеством подробного синтаксиса:
#include <boost/range/algorithm/copy.hpp>
#include <boost/range/adaptor/filtered.hpp>
#include <queue>
#include <vector>
int main() {
using namespace std;
vector<int> vi={1,2,3,4,5,6,7,8,9,0};
auto filter = [](int a) { return a > 4; };
using C = priority_queue<int, vector<int>, greater<int>>;
C pq = boost::copy_range<C>(vi | boost::adaptors::filtered(filter));
}
Под капотом boost::copy_range<Sequence>(...)
делает return Sequence(begin, end)
для создания возвращаемого значения из двух итераторов диапазона.Вызов этого конструктора более эффективен, чем решения, использующие итераторы push / insert.