c++ - set_intersection在范围范围内

标签 c++ range-v3

为什么不能执行以下操作:

std::vector<std::vector<int>> v1{{0,0}, {1,0}, {1,1}, {0,1}};
std::vector<std::vector<int>> v2{{1,0}, {2,0}, {2,1}, {1,1}};
auto p = ranges::set_intersection(v1,v2);

其中p的结果为{{1,0}, {1,1}}。我想我要匹配子集。如果set_intersection接受一个自定义谓词来提供此行为,那就太好了。我可以想到至少一种使用其他范围进行此操作的方法,例如:
  auto equal = [](auto&& t){return ranges::equal(std::get<0>(t), std::get<1>(t));};

  auto matching_subsets = ranges::views::cartesian_product(v1,v2)
    | ranges::views::filter(equal)
    | ranges::views::transform([](auto&& t){return std::get<0>(t);});

我正在想像的东西:
auto p = ranges::set_intersection(v1, v2, ranges::equal);

最佳答案

我们可以使用std::set_intersection(如注释中提到的jrok)并执行以下操作,

std::vector<std::vector<int>> v1{{0,0}, {1,0}, {1,1}, {0,1}};
std::vector<std::vector<int>> v2{{1,0}, {2,0}, {2,1}, {1,1}};
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::vector<std::vector<int>> v_intersection;

std::set_intersection(v1.begin(), v1.end(),
                      v2.begin(), v2.end(),
                      std::back_inserter(v_intersection));
for(const auto& v : v_intersection){
    for(const auto& n : v){
        cout<<n<<" ";
    }
    cout<<endl;
}

输出量
1 0 
1 1

请注意,必须对两个输入范围进行排序才能起作用。

关于c++ - set_intersection在范围范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029089/

相关文章:

c++ - 访问 vector 中的结构元素

c++ - range-v3:调整已经实现迭代器接口(interface)的自定义类(开始/结束)

c++ - 如何发送C++和mysql动态mysql查询

python - Boost.Python boost::shared_ptr 没有通过值转换器找到 python

c++ - 如何从 range-v3 的 istream_range 中检索文件大小?

c++ - 如何将 range::actions::insert 与 std::vector 一起使用

c++ - 通过按索引选择范围的元素来创建 View

c++ - 迭代容器或范围 - constness 问题

c++ - 在 lambda [C++] 中捕获它的替代方法

c++ - QT 有没有不用QTNetworkManager 加载图片的其他方法?