разделить диапазон чисел на несколько диапазонов с помощью range-v3

У меня есть определенное количество точек и несколько тетраэдров в пространстве, и для каждой точки я вычисляю, в каком тетраэдре она находится. Точки, не входящие в тетраэдр, отбрасываются.

auto samplerIdAndCoarseTetra = mcSamplers 
    ranges::views::transform([&coarseAABBTree](const auto &mcSampler) {
        return coarseAABBTree.any_intersected_primitive(mcSampler);
    }) |
    ranges::views::enumerate | ranges::views::filter([](const auto &tetrahedron) -> bool {
        return std::get<1>(tetrahedron).has_value();
    }) |
    ranges::views::transform([&coarseResCGALTetrahedra](const auto &tetrahedron) {
        return std::make_tuple(
           std::get<0>(tetrahedron),
           std::distance(std::begin(coarseResCGALTetrahedra), std::get<1>(tetrahedron).value()));
    });

Теперь у меня есть диапазоны кортежа целых чисел (один для индекса точки, один для индекса тетраэдра). Один из возможных результатов выглядит примерно так:

({0,4}, {1,4}, {3, 2}, {4,4},{4,2}) 

Теперь я хочу отделить точки в тетраэдре номер 4 от точек в тетраэдре номер 2. Я могу упорядочить кортежи, так что у меня есть

({0,4}, {1,4}, {4, 4}, {3,2},{4,2}) 

но я все же разделю этот диапазон на 2 диапазона

({0,4}, {1,4}, {4,4}), ({4,4}, {4,2})

можно ли добиться этого, используя только range-v3? Я знаю, что есть ranges::views::split, но это разбивается по значению, и этот случай выглядит иначе.


person jjcasmar    schedule 21.01.2021    source источник


Ответы (1)


Вы не хотите split, но group_by:

auto same_tetra = [](auto& lhs, auto& rhs){ return std::get<1>(lhs) == std::get<1>(rhs); };
// vec, your range of tuples.
auto groups = vec | ranges::view::group_by(same_tetra);

Демо

person Jarod42    schedule 21.01.2021