Skip to content

Latest commit

 

History

History
92 lines (74 loc) · 2.99 KB

mergeable.md

File metadata and controls

92 lines (74 loc) · 2.99 KB

mergeable

  • iterator[meta header]
  • std[meta namespace]
  • concept[meta id-type]
  • cpp20[meta cpp]
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>>;
}
  • less[link /reference/functional/less.md]
  • identity[link /reference/functional/identity.md]
  • input_iterator[link /reference/iterator/input_iterator.md]
  • weakly_incrementable[link /reference/iterator/weakly_incrementable.md]
  • indirectly_copyable[link /reference/iterator/indirectly_copyable.md]
  • indirect_strict_weak_order[link /reference/iterator/indirect_strict_weak_order.md]
  • projected[link /reference/iterator/projected.md]

概要

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;
}
  • std::mergeable[color ff0000]

出力

true
true
true
true

false
false
false

バージョン

言語

  • C++20

処理系

関連項目

参照