【问题标题】:split a range of numbers into several ranges with ranges-v3使用 range-v3 将一个数字范围拆分为多个范围
【发布时间】:2021-01-21 01:42:44
【问题描述】:

我在空间中有一定数量的点和一些四面体,对于每个点,我计算它在哪个四面体中。不在四面体中的点将被丢弃。

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,但这会拆分一个值,而且这种情况看起来不同。

【问题讨论】:

    标签: c++ range-v3


    【解决方案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);
    

    Demo

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2020-02-28
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多