Skip to content

Commit da057c7

Browse files
committed
ソート済み構造に対する集合演算の説明を追加 #919
1 parent 9b6fbae commit da057c7

File tree

6 files changed

+554
-5
lines changed

6 files changed

+554
-5
lines changed

reference/algorithm.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,11 +329,11 @@ ranges::sort(pv, {}, &Parson::name);
329329
| [`set_difference`](algorithm/set_difference.md) | 2つのソート済み範囲の差集合を得る | |
330330
| [`set_symmetric_difference`](algorithm/set_symmetric_difference.md) | 2つのソート済み範囲の対称差集合を得る | |
331331
| [`includes`](algorithm/includes.md) | 2つのソート済み範囲において、一方の範囲の要素がもう一方の範囲に全て含まれているかを判定する | |
332-
| [`ranges::set_union`](algorithm/ranges_set_union.md.nolink) | 2つのソート済み範囲の和集合を得る | C++20 |
333-
| [`ranges::set_intersection`](algorithm/ranges_set_intersection.md.nolink) | 2つのソート済み範囲の積集合を得る | C++20 |
334-
| [`ranges::set_difference`](algorithm/ranges_set_difference.md.nolink) | 2つのソート済み範囲の差集合を得る | C++20 |
335-
| [`ranges::set_symmetric_difference`](algorithm/ranges_set_symmetric_difference.md.nolink) | 2つのソート済み範囲の対称差集合を得る | C++20 |
336-
| [`ranges::includes`](algorithm/ranges_includes.md.nolink) | 2つのソート済み範囲において、一方の範囲の要素がもう一方の範囲に全て含まれているかを判定する | C++20 |
332+
| [`ranges::set_union`](algorithm/ranges_set_union.md) | 2つのソート済み範囲の和集合を得る | C++20 |
333+
| [`ranges::set_intersection`](algorithm/ranges_set_intersection.md) | 2つのソート済み範囲の積集合を得る | C++20 |
334+
| [`ranges::set_difference`](algorithm/ranges_set_difference.md) | 2つのソート済み範囲の差集合を得る | C++20 |
335+
| [`ranges::set_symmetric_difference`](algorithm/ranges_set_symmetric_difference.md) | 2つのソート済み範囲の対称差集合を得る | C++20 |
336+
| [`ranges::includes`](algorithm/ranges_includes.md) | 2つのソート済み範囲において、一方の範囲の要素がもう一方の範囲に全て含まれているかを判定する | C++20 |
337337
338338
### ヒープ
339339
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# includes
2+
* algorithm[meta header]
3+
* std::ranges[meta namespace]
4+
* function template[meta id-type]
5+
* cpp20[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, class Proj1 = identity, class Proj2 = identity,
10+
indirect_strict_weak_order<projected<I1, Proj1>, projected<I2, Proj2>> Comp = ranges::less>
11+
constexpr bool includes(I1 first1, S1 last1, I2 first2, S2 last2, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // (1)
12+
13+
template<input_range R1, input_range R2, class Proj1 = identity, class Proj2 = identity,
14+
indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>, projected<iterator_t<R2>, Proj2>> Comp = ranges::less>
15+
constexpr bool ranges::includes(R1&& r1, R2&& r2, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // (2)
16+
}
17+
```
18+
* input_iterator[link /reference/iterator/input_iterator.md]
19+
* sentinel_for[link /reference/iterator/sentinel_for.md]
20+
* indirect_strict_weak_order[link /reference/iterator/indirect_strict_weak_order.md]
21+
* projected[link /reference/iterator/projected.md]
22+
* ranges::less[link /reference/functional/ranges_less.md]
23+
* identity[link /reference/functional/identity.md]
24+
* input_range[link /reference/ranges/input_range.md]
25+
* iterator_t[link /reference/ranges/iterator_t.md]
26+
27+
## 概要
28+
2つのソート済み範囲において、一方の範囲の要素がもう一方の範囲に全て含まれているかを判定する。
29+
30+
* (1): イテレーターペアで範囲を指定する
31+
* (2): 範囲を直接指定する
32+
33+
## 戻り値
34+
`[first2,last2)` が `empty` であるか、`[first2,last2)` の全ての要素が `[first1,last1)` に含まれている場合は `true`、そうでない場合は `false` を返す。
35+
36+
37+
## 計算量
38+
最大で `2 * ((last1 - first1) + (last2 - first2)) - 1` 回比較する
39+
40+
41+
## 例
42+
```cpp example
43+
#include <iostream>
44+
#include <set>
45+
#include <algorithm>
46+
47+
int main()
48+
{
49+
std::set<int> a = {1, 2, 3, 4, 5, 6};
50+
std::set<int> b = {2, 4, 6};
51+
std::set<int> c = {2, 4, 7};
52+
53+
std::cout << std::boolalpha;
54+
55+
std::cout << std::ranges::includes(a, b) << std::endl;
56+
std::cout << std::ranges::includes(a, c) << std::endl;
57+
}
58+
```
59+
* std::ranges::includes[color ff0000]
60+
61+
### 出力
62+
```
63+
true
64+
false
65+
```
66+
67+
## バージョン
68+
### 言語
69+
- C++20
70+
71+
### 処理系
72+
- [Clang](/implementation.md#clang): ??
73+
- [GCC](/implementation.md#gcc): 10.1.0
74+
- [ICC](/implementation.md#icc): ??
75+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10
76+
77+
## 参照
78+
- [N4861 25 Algorithms library](https://timsong-cpp.github.io/cppwp/n4861/algorithms)
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# set_difference
2+
* algorithm[meta header]
3+
* std::ranges[meta namespace]
4+
* function template[meta id-type]
5+
* cpp20[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<class I, class O>
10+
using set_union_result = in_out_result<I, O>;
11+
12+
template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, weakly_incrementable O,
13+
class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
14+
requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
15+
constexpr set_difference_result<I1, O>
16+
set_difference(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // (1)
17+
18+
template<input_range R1, input_range R2, weakly_incrementable O,
19+
class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
20+
requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
21+
constexpr set_difference_result<borrowed_iterator_t<R1>, O>
22+
set_difference(R1&& r1, R2&& r2, O result, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // (2)
23+
}
24+
```
25+
* in_out_result[link in_out_result.md.nolink]
26+
* input_iterator[link /reference/iterator/input_iterator.md]
27+
* sentinel_for[link /reference/iterator/sentinel_for.md]
28+
* weakly_incrementable[link /reference/iterator/weakly_incrementable.md]
29+
* ranges::less[link /reference/functional/ranges_less.md]
30+
* identity[link /reference/functional/identity.md]
31+
* mergeable[link /reference/iterator/mergeable.md]
32+
* input_range[link /reference/ranges/input_range.md]
33+
* iterator_t[link /reference/ranges/iterator_t.md]
34+
* borrowed_iterator_t[link /reference/ranges/borrowed_iterator_t.md]
35+
36+
37+
## 概要
38+
2つのソート済み範囲の差集合を得る
39+
40+
* (1): イテレーターペアで範囲を指定する
41+
* (2): 範囲を直接指定する
42+
43+
## 事前条件
44+
結果の範囲は両方の入力の範囲と重なっていてはならない。
45+
46+
47+
## 効果
48+
`[first1,last1)` から、`[first2,last2)` に存在していない要素を `result` へコピーする。構築された範囲はソートされている。
49+
50+
51+
## 戻り値
52+
次のメンバをもつtuple-likeオブジェクト。
53+
54+
```cpp
55+
set_union_result {
56+
.in = last1,
57+
.out = result_last,
58+
}
59+
```
60+
61+
ただし、`result_last` は構築された範囲の終端。
62+
63+
64+
## 計算量
65+
最大で `2 * ((last1 - first1) + (last2 - first2)) - 1` 回の比較を行う
66+
67+
68+
## 備考
69+
`[first1,last1)``m` 個、`[first2,last2)``n` 個の等価な要素を含んでいる場合、`[first1,last1)` から最後の [`max`](max.md)`(m-n, 0)` 要素が出力の範囲へコピーされる。
70+
71+
72+
##
73+
```cpp example
74+
#include <iostream>
75+
#include <set>
76+
#include <algorithm>
77+
#include <iterator>
78+
79+
int main()
80+
{
81+
std::multiset<int> a = {1, 2, 3, 4, 5, 6};
82+
std::multiset<int> b = {2, 3, 4};
83+
std::multiset<int> result;
84+
85+
// a - bの差集合を作る
86+
std::ranges::set_difference(a, b, std::inserter(result, result.end()));
87+
88+
for (int x : result) {
89+
std::cout << x << std::endl;
90+
}
91+
}
92+
```
93+
* std::ranges::set_difference[color ff0000]
94+
* std::multiset[link /reference/set/multiset.md]
95+
* begin()[link /reference/set/set/begin.md]
96+
* end()[link /reference/set/set/end.md]
97+
* std::inserter[link /reference/iterator/inserter.md]
98+
99+
### 出力
100+
```
101+
1
102+
5
103+
6
104+
```
105+
106+
## バージョン
107+
### 言語
108+
- C++20
109+
110+
### 処理系
111+
- [Clang](/implementation.md#clang): ??
112+
- [GCC](/implementation.md#gcc): 10.1.0
113+
- [ICC](/implementation.md#icc): ??
114+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10
115+
116+
## 参照
117+
- [N4861 25 Algorithms library](https://timsong-cpp.github.io/cppwp/n4861/algorithms)
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# set_intersection
2+
* algorithm[meta header]
3+
* std::ranges[meta namespace]
4+
* function template[meta id-type]
5+
* cpp20[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template<class I1, class I2, class O>
10+
using set_intersection_result = in_in_out_result<I1, I2, O>;
11+
12+
template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, weakly_incrementable O,
13+
class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
14+
requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
15+
constexpr set_intersection_result<I1, I2, O>
16+
set_intersection(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // (1)
17+
18+
template<input_range R1, input_range R2, weakly_incrementable O,
19+
class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
20+
requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
21+
constexpr set_intersection_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
22+
set_intersection(R1&& r1, R2&& r2, O result, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // (2)
23+
}
24+
```
25+
* in_in_out_result[link in_in_out_result.md.nolink]
26+
* input_iterator[link /reference/iterator/input_iterator.md]
27+
* sentinel_for[link /reference/iterator/sentinel_for.md]
28+
* weakly_incrementable[link /reference/iterator/weakly_incrementable.md]
29+
* ranges::less[link /reference/functional/ranges_less.md]
30+
* identity[link /reference/functional/identity.md]
31+
* mergeable[link /reference/iterator/mergeable.md]
32+
* input_range[link /reference/ranges/input_range.md]
33+
* iterator_t[link /reference/ranges/iterator_t.md]
34+
* borrowed_iterator_t[link /reference/ranges/borrowed_iterator_t.md]
35+
36+
## 概要
37+
2つのソート済み範囲の積集合を得る
38+
39+
* (1): イテレーターペアで範囲を指定する
40+
* (2): 範囲を直接指定する
41+
42+
43+
## 事前条件
44+
結果の範囲は両方の入力の範囲と重なっていてはならない。
45+
46+
47+
## 効果
48+
2つの範囲からソート済みの intersection を構築する。つまり、両方の範囲のみにある要素の集合を構築する。
49+
50+
51+
## 戻り値
52+
次のメンバをもつtuple-likeオブジェクト。
53+
54+
```cpp
55+
set_union_result {
56+
.in1 = last1,
57+
.in2 = last2,
58+
.out = result_last,
59+
}
60+
```
61+
62+
ただし、`result_last` は構築された範囲の終端。
63+
64+
## 計算量
65+
最大で `2 * ((last1 - first1) + (last2 - first2)) - 1` 回の比較を行う
66+
67+
68+
## 備考
69+
`[first1,last1)``m` 個、`[first2,last2)``n` 個の等価な要素を含んでいる場合、`[first1,last1)` から最初の [`min`](min.md)`(m, n)` 要素が出力の範囲へ順番にコピーされる。
70+
71+
72+
##
73+
```cpp example
74+
#include <iostream>
75+
#include <set>
76+
#include <algorithm>
77+
#include <iterator>
78+
79+
int main()
80+
{
81+
std::multiset<int> a = {1, 2, 3, 4};
82+
std::multiset<int> b = {4, 5, 6, 2};
83+
std::multiset<int> result;
84+
85+
// aとbの積集合を作る
86+
std::set_intersection(a, b, std::inserter(result, result.end()));
87+
88+
for (int x : result) {
89+
std::cout << x << std::endl;
90+
}
91+
}
92+
```
93+
* std::ranges::set_intersection[color ff0000]
94+
* std::multiset[link /reference/set/multiset.md]
95+
* end()[link /reference/set/set/end.md]
96+
* std::inserter[link /reference/iterator/inserter.md]
97+
98+
### 出力
99+
```
100+
2
101+
4
102+
```
103+
104+
## バージョン
105+
### 言語
106+
- C++20
107+
108+
### 処理系
109+
- [Clang](/implementation.md#clang): ??
110+
- [GCC](/implementation.md#gcc): 10.1.0
111+
- [ICC](/implementation.md#icc): ??
112+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10
113+
114+
## 参照
115+
- [N4861 25 Algorithms library](https://timsong-cpp.github.io/cppwp/n4861/algorithms)

0 commit comments

Comments
 (0)