web-dev-qa-db-ja.com

C ++のベクトル交差

この機能があります

vector<string> instersection(const vector<string> &v1, const vector<string> &v2);

文字列の2つのベクトルがあり、両方に存在する文字列を検索したい場合、3番目のベクトルに共通の要素を入力します。

私のベクトルが...

v1 = <"a","b","c">
v2 = <"b","c">
20
Tyler

std::set_intersection 、例:

#include <algorithm> //std::sort
#include <iostream> //std::cout
#include <string> //std::string
#include <vector> //std::vector

std::vector<std::string> intersection(std::vector<std::string> &v1,
                                      std::vector<std::string> &v2){
    std::vector<std::string> v3;

    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::set_intersection(v1.begin(),v1.end(),
                          v2.begin(),v2.end(),
                          back_inserter(v3));
    return v3;
}

int main(){
    std::vector<std::string> v1 {"a","b","c"};
    std::vector<std::string> v2 {"b","c"};

    auto v3 = intersection(v1, v2);

    for(std::string n : v3)
        std::cout << n << ' ';
}
41
deepmax

小さいベクトルだけをソートする必要があります。次に、より大きなベクトルを1回パスし、バイナリ検索を使用して、より小さなベクトルでそのアイテムの存在をテストします。

3
Mikhail Volskiy

here のように、ソートする代わりに、小さいベクトルからハッシュセットを作成し、それらの要素をチェックする大きいベクトルをループ処理することにより、メモリを時間的に取引することを検討してください。これは、std::set_intersectionをソートして使用するよりも高速です。

0
Eric Auld