GeezerVison is showing cpprefjp.github.io — std::ranges::set_difference - cpprefjp C++日本語リファレンス
最終更新日時:
2026年09月11日 13時06分31秒 (JST)
Akira Takahashi
が更新
履歴
編集
function template
<algorithm>
std::ranges:: set_difference (C++20)
namespace std :: ranges {
template < input_iterator I1 ,
sentinel_for < I1 > S1 ,
input_iterator I2 ,
sentinel_for < I2 > S2 ,
weakly_incrementable O ,
class Comp = ranges::less ,
class Proj1 = identity ,
class Proj2 = identity >
requires mergeable < I1 , I2 , O , Comp , Proj1 , Proj2 >
constexpr set_difference_result < I1 , O >
set_difference ( I1 first1 ,
S1 last1 ,
I2 first2 ,
S2 last2 ,
O result ,
Comp comp = {},
Proj1 proj1 = {},
Proj2 proj2 = {}); // (1) C++20
template < input_range R1 ,
input_range R2 ,
weakly_incrementable O ,
class Comp = ranges::less ,
class Proj1 = identity ,
class Proj2 = identity >
requires mergeable < iterator_t < R1 > , iterator_t < R2 > , O , Comp , Proj1 , Proj2 >
constexpr set_difference_result < borrowed_iterator_t < R1 > , O >
set_difference ( R1 && r1 ,
R2 && r2 ,
O result ,
Comp comp = {},
Proj1 proj1 = {},
Proj2 proj2 = {}); // (2) C++20
template < execution-policy Ep ,
random_access_iterator I1 ,
sized_sentinel_for < I1 > S1 ,
random_access_iterator I2 ,
sized_sentinel_for < I2 > S2 ,
random_access_iterator O ,
sized_sentinel_for < O > OutS ,
class Comp = ranges::less ,
class Proj1 = identity ,
class Proj2 = identity >
requires mergeable < I1 , I2 , O , Comp , Proj1 , Proj2 >
set_difference_truncated_result < I1 , I2 , O >
set_difference ( Ep && exec ,
I1 first1 ,
S1 last1 ,
I2 first2 ,
S2 last2 ,
O result ,
OutS result_last ,
Comp comp = {},
Proj1 proj1 = {},
Proj2 proj2 = {}); // (3) C++26
template < execution-policy Ep ,
sized-random-access-range R1 ,
sized-random-access-range R2 ,
sized-random-access-range OutR ,
class Comp = ranges::less ,
class Proj1 = identity ,
class Proj2 = identity >
requires mergeable < iterator_t < R1 > , iterator_t < R2 > , iterator_t < OutR > , Comp , Proj1 , Proj2 >
set_difference_truncated_result < borrowed_iterator_t < R1 > , borrowed_iterator_t < R2 > , borrowed_iterator_t < OutR >>
set_difference ( Ep && exec ,
R1 && r1 ,
R2 && r2 ,
OutR && result_r ,
Comp comp = {},
Proj1 proj1 = {},
Proj2 proj2 = {}); // (4) C++26
}
概要
2つのソート済み範囲の差集合を得る
(1): イテレータ範囲を指定する
(2): Rangeを直接指定する
(3): (1)の並列アルゴリズム版。実行ポリシーを指定する
(4): (2)の並列アルゴリズム版。実行ポリシーを指定する
事前条件
結果の範囲は両方の入力の範囲と重なっていてはならない。
効果
[first1,last1) から、[first2,last2) に存在していない要素を result へコピーする。構築された範囲はソートされている。
戻り値
(1), (2) :
ただし、result_last は構築された範囲の終端。
(3), (4) : set_difference_truncated_result を返す。[first1, last1)/[first2, last2)のうちコピーまたはスキップされた要素数をそれぞれA/B、resultへ書き込んだ要素数をN、出力範囲の要素数(resultからresult_lastまでの距離)をMとする。
N == Mのとき(出力バッファを使い切ったとき):{.in1 = last1, .in2 = first2 + B, .out = result + N}
そうでなければ:{.in1 = first1 + A, .in2 = first2 + B, .out = result_last}
計算量
最大で 2 * ((last1 - first1) + (last2 - first2)) - 1 回の比較を行う
備考
[first1,last1) が m 個、[first2,last2) が n 個の等価な要素を含んでいる場合、[first1,last1) から最後の max (m-n, 0) 要素が出力の範囲へコピーされる。
例
基本的な使い方
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
int main ()
{
std::multiset < int > a = { 1 , 2 , 3 , 4 , 5 , 6 };
std::multiset < int > b = { 2 , 3 , 4 };
std::multiset < int > result ;
// a - bの差集合を作る
std::ranges::set_difference ( a , b , std::inserter ( result , result . end() ));
for ( int x : result ) {
std::cout << x << std::endl ;
}
}
出力
1
5
6
並列アルゴリズムの例 (C++26)
#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>
int main ()
{
std::vector < int > a = { 1 , 2 , 3 , 4 , 5 , 6 };
std::vector < int > b = { 2 , 3 , 4 };
std::vector < int > result ( a . size ());
// 並列にa - bの差集合を作る
auto ret = std::ranges::set_difference (
std::execution::par ,
a ,
b ,
result
);
for ( auto it = result . begin (); it != ret . out ; ++ it ) {
std::cout << * it << ' ' ;
}
std::cout << std::endl ;
}
出力
1 5 6
バージョン
言語
処理系
参照