GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing cpprefjp.github.io — std::common_iterator - cpprefjp C++日本語リファレンス class template <iterator> std::common_iterator(C++20)概要
同じ範囲についてのイテレータ/番兵を保持して、等値比較演算子を適切に実装することで共通化を行う。 メンバ関数
非メンバ(Hidden friends)関数
|
| 名前 | 説明 | 対応バージョン |
|---|---|---|
iterator_concept |
forward_iterator_tag ただし、 Iがforward_iteratorのモデルではない場合はinput_iterator_tag |
C++20 |
iterator_category |
forward_iterator_tag ただし、 iterator_traits<I>::iterator_categoryがderived_from<forward_iterator_tag>のモデルではない場合はinput_iterator_tag |
C++20 |
value_type |
iter_value_t<I> |
C++20 |
difference_type |
iter_difference_t<I> |
C++20 |
pointer |
void ただし、 operator->が利用可能である場合はその戻り値型 |
C++20 |
reference |
iter_reference_t<I> |
C++20 |
iterator_categoryはiter_difference_t<I>が組み込みの整数型の場合にのみ定義される(integer-class型の場合には定義されない)#include <iostream>
#include <iterator>
#include <ranges>
// イテレータによって範囲の要素を出力する
// イテレータ型と番兵型が同一であることを前提とするレガシーな実装
template<typename I>
void iter_output(I it, I end) {
for (;it != end; ++it) {
std::cout << *it << std::endl;
}
}
int main() {
auto seq = std::views::iota(1) | std::views::take(5);
// 範囲seqはイテレータ型と番兵型が異なっているためそのままだとエラー
//iter_output(std::ranges::begin(seq), std::ranges::end(seq));
// common_iteratorを通すことでイテレータ型と番兵型を合わせる
using CI = std::common_iterator<std::ranges::iterator_t<decltype(seq)>, std::ranges::sentinel_t<decltype(seq)>>;
auto it = CI{std::ranges::begin(seq)};
auto end = CI{std::ranges::end(seq)};
iter_output(it, end);
}
1
2
3
4
5