NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
algorithm/set.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_SET_HPP__
2#define NEFORCE_CORE_ALGORITHM_SET_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
20
26
46template <typename Iterator1, typename Iterator2, typename Iterator3>
47constexpr Iterator3 set_union(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator3 result) {
48 static_assert(is_ranges_fwd_iter_v<Iterator1>, "Iterator1 must be forward_iterator");
49 static_assert(is_ranges_fwd_iter_v<Iterator2>, "Iterator2 must be forward_iterator");
50 static_assert(is_iter_v<Iterator3>, "Iterator3 must be iterator");
51
52 while (first1 != last1 && first2 != last2) {
53 if (*first1 < *first2) {
54 *result = *first1;
55 ++first1;
56 } else if (*first2 < *first1) {
57 *result = *first2;
58 ++first2;
59 } else {
60 *result = *first1;
61 ++first1;
62 ++first2;
63 }
64 ++result;
65 }
66 return _NEFORCE copy(first2, last2, _NEFORCE copy(first1, last1, result));
67}
68
84template <typename Iterator1, typename Iterator2, typename Iterator3>
85constexpr Iterator3 set_intersection(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2,
86 Iterator3 result) {
87 static_assert(is_ranges_fwd_iter_v<Iterator1>, "Iterator1 must be forward_iterator");
88 static_assert(is_ranges_fwd_iter_v<Iterator2>, "Iterator2 must be forward_iterator");
89 static_assert(is_iter_v<Iterator3>, "Iterator3 must be iterator");
90
91 while (first1 != last1 && first2 != last2) {
92 if (*first1 < *first2) {
93 ++first1;
94 } else if (*first2 < *first1) {
95 ++first2;
96 } else {
97 *result = *first1;
98 ++first1;
99 ++first2;
100 ++result;
101 }
102 }
103 return result;
104}
105
121template <typename Iterator1, typename Iterator2, typename Iterator3>
122constexpr Iterator3 set_difference(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2,
123 Iterator3 result) {
124 static_assert(is_ranges_fwd_iter_v<Iterator1>, "Iterator1 must be forward_iterator");
125 static_assert(is_ranges_fwd_iter_v<Iterator2>, "Iterator2 must be forward_iterator");
126 static_assert(is_iter_v<Iterator3>, "Iterator3 must be iterator");
127
128 while (first1 != last1 && first2 != last2) {
129 if (*first1 < *first2) {
130 *result = *first1;
131 ++first1;
132 ++result;
133 } else if (*first2 < *first1) {
134 ++first2;
135 } else {
136 ++first1;
137 ++first2;
138 }
139 }
140 return _NEFORCE copy(first1, last1, result);
141}
142
159template <typename Iterator1, typename Iterator2, typename Iterator3>
160constexpr Iterator3 set_symmetric_difference(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2,
161 Iterator3 result) {
162 static_assert(is_ranges_fwd_iter_v<Iterator1>, "Iterator1 must be forward_iterator");
163 static_assert(is_ranges_fwd_iter_v<Iterator2>, "Iterator2 must be forward_iterator");
164 static_assert(is_iter_v<Iterator3>, "Iterator3 must be iterator");
165
166 while (first1 != last1 && first2 != last2) {
167 if (*first1 < *first2) {
168 *result = *first1;
169 ++first1;
170 ++result;
171 } else if (*first2 < *first1) {
172 *result = *first2;
173 ++first2;
174 ++result;
175 } else {
176 ++first1;
177 ++first2;
178 }
179 }
180 return _NEFORCE copy(first2, last2, _NEFORCE copy(first1, last1, result));
181}
182 // SetAlgorithms
184 // StandardAlgorithms
186
187NEFORCE_END_NAMESPACE__
188#endif // NEFORCE_CORE_ALGORITHM_SET_HPP__
constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
constexpr bool is_iter_v
检查类型是否为迭代器
constexpr Iterator3 set_union(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator3 result)
计算两个已排序范围的并集
constexpr Iterator3 set_symmetric_difference(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator3 result)
计算两个已排序范围的对称差集
constexpr Iterator3 set_difference(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator3 result)
计算两个已排序范围的差集
constexpr Iterator3 set_intersection(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator3 result)
计算两个已排序范围的交集
constexpr Iterator2 copy(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_aux(first, last, result)))
复制范围元素
移位和修改算法