The Wayback Machine - https://web.archive.org/web/20180326071250/http://ja.cppreference.com:80/w/cpp/algorithm/set_intersection
名前空間
変種
操作

std::set_intersection

提供: cppreference.com
< cpp‎ | algorithm

 
 
アルゴリズムライブラリ
実行ポリシー (C++17)
非変更シーケンス操作
(C++11)(C++11)(C++11)
(C++17)
変更シーケンス操作
未初期化記憶域の操作
分割操作
ソート操作
バイナリサーチ操作
集合操作 (ソート済み範囲に対する)
set_intersection
ヒープ操作
(C++11)
最小/最大演算
(C++11)
(C++17)
順列
数値演算
C のライブラリ
 
ヘッダ <algorithm> で定義
template<class InputIt1, class InputIt2, class OutputIt >

OutputIt set_intersection( InputIt1 first1, InputIt1 last1,
                           InputIt2 first2, InputIt2 last2,

                           OutputIt d_first );
(1)
template<class InputIt1, class InputIt2,

          class OutputIt, class Compare >
OutputIt set_intersection( InputIt1 first1, InputIt1 last1,
                           InputIt2 first2, InputIt2 last2,

                           OutputIt d_first, Compare comp );
(2)
両方のソート範囲で発見された要素から成るd_firstでソートされた範囲の先頭を構築[first1, last1)[first2, last2)。最初のバージョンでは、両方の入力がoperator<でソートされている範囲では、2番目のバージョンは、それらが与えられた比較関数compでソートされることを想定して期待しています。いくつかの要素がm[first1, last1)n[first2, last2)時間が見つかった場合、最初std::min(m, n)要素は最初の範囲から先のセル範囲にコピーされます。同等の要素の順序は保持されます。結果の範囲は入力レンジのいずれかと重複することはできません.
Original:
Constructs a sorted range beginning at d_first consisting of elements that are found in both sorted ranges [first1, last1) and [first2, last2). The first version expects both input ranges to be sorted with operator<, the second version expects them to be sorted with the given comparison function comp. If some element is found m times in [first1, last1) and n times in [first2, last2), the first std::min(m, n) elements will be copied from the first range to the destination range. The order of equivalent elements is preserved. The resulting range cannot overlap with either of the input ranges.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

目次

[編集]パラメータ

first1, last1 -
検討する要素の最初の範囲
Original:
the first range of elements to examine
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
first2, last2 -
検討する要素の第2の範囲
Original:
the second range of elements to examine
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
comp - 比較関数. 最初の値が二つ目の値より小さい 場合、 ​trueを返します.

比較関数のシグネチャは以下と同等でなければなりません.

 bool cmp(const Type1 &a, const Type2 &b);

シグネチャはconstを含まなくても構いませんが, 比較関数は渡されたオブジェクトを変更してはなりません.
Type1 および Type2 は、 InputIt1 および InputIt2 型のオブジェクトの逆参照からType1 および Type2 にそれぞれ暗黙に変換可能なものでなければなりません。 ​

型の要件
-
InputIt1InputIterator の要件を満たさなければなりません。
-
InputIt2InputIterator の要件を満たさなければなりません。
-
OutputItOutputIterator の要件を満たさなければなりません。

[編集]値を返します

構築範囲の終わり過去イテレータ.
Original:
Iterator past the end of the constructed range.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[編集]複雑性

最も2·(N1+N2-1)の比較で、どこN1=std::distance(first1, last1)N2=std::distance(first2, last2).
Original:
At most 2·(N1+N2-1) comparisons, where N1=std::distance(first1, last1) and N2=std::distance(first2, last2).
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[編集]可能な実装

1つめのバージョン
template<class InputIt1, class InputIt2, class OutputIt> OutputIt set_intersection(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first){while(first1 != last1 && first2 != last2){if(*first1 <*first2){++first1;}else{if(!(*first2 <*first1)){*d_first++=*first1++;}++first2;}}return d_first;}
2つめのバージョン
template<class InputIt1, class InputIt2, class OutputIt, class Compare> OutputIt set_intersection(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first, Compare comp){while(first1 != last1 && first2 != last2){if(comp(*first1, *first2)){++first1;}else{if(!comp(*first2, *first1)){*d_first++=*first1++;}++first2;}}return d_first;}


[編集]

#include <iostream>#include <vector>#include <algorithm>#include <iterator>int main(){std::vector<int> v1{1,2,3,4,5,6,7,8};std::vector<int> v2{5, 7, 9,10};std::sort(v1.begin(), v1.end());std::sort(v2.begin(), v2.end());   std::vector<int> v_intersection;   std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v_intersection));for(int n : v_intersection)std::cout<< n <<' ';}

出力:

5 7

[編集]参照

2つの集合の和を計算します
(関数テンプレート)[edit]
close