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

std::set_difference

提供: cppreference.com
< cpp‎ | algorithm

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

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

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

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

                         OutputIt d_first, Compare comp );
(2)
ソート範囲[first1, last1)で発見されていないソート範囲[first2, last2)からd_firstで範囲の先頭に要素をコピーします.
Original:
Copies the elements from the sorted range [first1, last1) which are not found in the sorted range [first2, last2) to the range beginning at d_first.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
結果として得られる範囲は、またソートされます。最初のバージョンでは、両方の入力がoperator<でソートされている範囲では、2番目のバージョンは、それらが与えられた比較関数compでソートされることを想定して期待しています。いくつかの要素がm[first1, last1)n[first2, last2)倍であることが判明した場合、同等の要素があること、個別に扱われ、それが正確にd_firststd::max(m-n, 0)倍にコピーされます。結果の範囲は入力レンジのいずれかと重複することはできません.
Original:
The resulting range is also sorted. 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. Equivalent elements are treated individually, that is, if some element is found m times in [first1, last1) and n times in [first2, last2), it will be copied to d_first exactly std::max(m-n, 0) times. 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 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 -
検索する要素の範囲
Original:
the range of elements to search for
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_difference(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first){while(first1 != last1){if(first2 == last2)returnstd::copy(first1, last1, d_first);   if(*first1 <*first2){*d_first++=*first1++;}else{if(!(*first2 <*first1)){++first1;}++first2;}}return d_first;}
2つめのバージョン
template<class InputIt1, class InputIt2, class OutputIt, class Compare> OutputIt set_difference( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first, Compare comp){while(first1 != last1){if(first2 == last2)returnstd::copy(first1, last1, d_first);   if(comp(*first1, *first2)){*d_first++=*first1++;}else{if(!comp(*first2, *first1)){++first1;}++first2;}}return d_first;}

[編集]

#include <iostream>#include <algorithm>#include <vector>#include <iterator>   int main(){std::vector<int> v1 {1, 2, 5, 5, 5, 9};std::vector<int> v2 {2, 5, 7};std::vector<int> diff;   std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::inserter(diff, diff.begin()));   for(auto i : v1)std::cout<< i <<' ';std::cout<<"minus ";for(auto i : v2)std::cout<< i <<' ';std::cout<<"is: ";   for(auto i : diff)std::cout<< i <<' ';std::cout<<'\n';}

出力:

1 2 5 5 5 9 minus 2 5 7 is: 1 5 5 9

[編集]参照

ある集合が別の集合の部分集合であるかどうか調べます
(関数テンプレート)[edit]
2つの集合の対称差を計算します
(関数テンプレート)[edit]
close