C++を初めて使用しましたリストです。C++で2つのリスト間の交差を適用する方法は?
私は2つのリスト:list1
とlist2
を持っています。私はこれらのリストの間で共通の要素を取得する必要があります。どのように私はこれを得ることができますか?
C++を初めて使用しましたリストです。C++で2つのリスト間の交差を適用する方法は?
私は2つのリスト:list1
とlist2
を持っています。私はこれらのリストの間で共通の要素を取得する必要があります。どのように私はこれを得ることができますか?
:そのためstd::set_intersection
を、あなたは最初の二つのリストを並べ替える提供:
例:
#include <algorithm>
#include <iostream>
#include <list>
int main() {
std::list<int> list1{2, 5, 7, 8, -3, 7};
std::list<int> list2{9, 1, 6, 3, 5, 2, 11, 0};
list1.sort();
list2.sort();
std::list<int> out;
std::set_intersection(list1.begin(), list1.end(), list2.begin(), list2.end(),
std::back_inserter(out));
for(auto k : out)
std::cout << k << ' ';
}
出力:
2 5
EDIT:
上記の方法は実行されない可能性があります我々は繰り返すので、スペースのトレードオフのために... std::list
をソートすることはCPUに素敵ではない主な理由は、最適であると
をINGの、以下の方法は、確かに、より大きなデータのセットのために高速になりますそれは両方のリストに共通の重複の出現箇所を保持するので、私はstd::unordered_multiset
ではなくstd::unordered_set
を使用
O(1)
償却複雑さを超えない各繰り返しで行われ、一度だけ、各リスト、およびすべての操作を通じて
Iは、ランダムに生成9000
int
S上の2つの方法のためdirty benchmarkを実行し、結果は(低い方がよい)であった。std::set_intersection
法を用いる
Average timings for 100 runs:
intersection_of: 8.16 ms
sortAndIntersect: 18.38 ms
分析:
N
のは:O(Nlog(N))
O(M + N)
M
の2があるリストソートO(Nlog(N) + Mlog(M) + M + N)
を...M
とN
が等しいと仮定すると、を(対数として一般化)、我々はとしてそれを一般化することができます:O(Nlog(N))
しかし、我々は、私は上記の投稿intersection_of
方法で使用する場合:リストを反復
N
であり、セットに加えることは:O(N) + O(1) = O(N)
out
に添加サイズM
、多重集合をチェックする、2:合計O(M) + O(1) + O(1) + O(1)
= O(M)
O(M + N)
...(リニアとして一般) M
とN
が等しいと仮定すると、次のように一般化することができます。O(N)
リスト*自体*重複はどうですか? – Bathsheba
[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)、[最小限の完全かつ検証可能な例]を作成する方法を学んでください(http:// stackoverflow .com/help/mcve)。 –
ここに示す例は、http://en.cppreference.com/w/cpp/algorithm/set_intersectionに従うことです。 – Bathsheba