![](/img/trans.png)
[英]std::set_intersection is for sorted ranges as [ _ ] is for unsorted ranges/containers
[英]set_intersection on range of ranges
為什么不能執行以下操作:
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
請注意,必須對兩個輸入范圍進行排序才能使其工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.