首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >范围的set_intersection

范围的set_intersection
EN

Stack Overflow用户
提问于 2020-02-03 02:10:34
回答 1查看 92关注 0票数 2

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

代码语言:javascript
复制
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采用自定义谓词来提供此行为,那就太好了。我至少可以想出一种使用其他范围的方法来做到这一点,例如:

代码语言:javascript
复制
  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);});

我是这样想的:

代码语言:javascript
复制
auto p = ranges::set_intersection(v1, v2, ranges::equal);
EN

回答 1

Stack Overflow用户

发布于 2020-02-03 02:29:11

我们可以使用std::set_intersection (正如评论中提到的jrok )并执行以下操作:

代码语言:javascript
复制
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;
}

输出

代码语言:javascript
复制
1 0 
1 1

请注意,必须对两个输入范围进行排序才能使其正常工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60029089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档