簡體   English   中英

set_intersection 在范圍范圍內

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM