namespace std {
template<class I1, class I2, class Out, class R = ranges::less,
class P1 = identity, class P2 = identity>
concept mergeable =
input_iterator<I1> &&
input_iterator<I2> &&
weakly_incrementable<Out> &&
indirectly_copyable<I1, Out> &&
indirectly_copyable<I2, Out> &&
indirect_strict_weak_order<R, projected<I1, P1>, projected<I2, P2>>;
}
概要
mergeable
は、イテレータ型I1, I2
がそれぞれ参照するソート済みの範囲を、R
による比較関数によってマージしつつOut
の指す出力イテレータ範囲にコピーできる事を表すコンセプトである。
また、その際にイテレータに対して任意の射影操作(P1, P2
)を指定する事ができる。
これは、merge
のような操作を可能とするための最小の要求である。
例
#include <iostream>
#include <concepts>
#include <iterator>
#include <memory>
#include <vector>
#include <forward_list>
#include <list>
int main() {
using proj = decltype([](const auto& pair) -> auto& { return std::get<0>(pair); });
std::cout << std::boolalpha;
std::cout << std::mergeable<int*, const int*, int*> << std::endl;
std::cout << std::mergeable<std::list<int>::iterator, std::vector<int>::iterator, std::forward_list<int>::iterator> << std::endl;
std::cout << std::mergeable<int*, const int*, int*, std::ranges::greater> << std::endl;
std::cout << std::mergeable<std::pair<int, double>*, std::tuple<int, double>*, std::vector<std::tuple<int, double>>::iterator, std::ranges::less, proj, proj> << std::endl;
std::cout << "\n";
std::cout << std::mergeable<int*, const int*, const int*> << std::endl;
std::cout << std::mergeable<int*, const int*, std::istream_iterator<int>> << std::endl;
std::cout << std::mergeable<int*, std::ostream_iterator<int>, int*> << std::endl;
}
出力
true
true
true
true
false
false
false
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 6 ✅