namespace std {
template<class I>
concept contiguous_iterator =
random_access_iterator<I> &&
derived_from<ITER_CONCEPT(I), contiguous_iterator_tag> &&
is_lvalue_reference_v<iter_reference_t<I>> &&
same_as<iter_value_t<I>, remove_cvref_t<iter_reference_t<I>>> &&
requires(const I& i) {
{ to_address(i) } -> same_as<add_pointer_t<iter_reference_t<I>>>;
};
}
概要
contiguous_iterator
は、イテレータ型I
が隣接イテレータであることを表すコンセプトである。
contiguous_iterator
となるイテレータは、ランダムアクセスイテレータであり、参照する要素列がメモリ上で連続していることが保証される。
モデル
a, b
を間接参照可能なイテレータ、c
を間接参照不可能なイテレータとし、b
はa
から、c
はb
からそれぞれ到達可能であるとする。そのような型I
のイテレータa, b, c
とiter_difference_t<I>
の示す型D
について次の条件を満たす場合に限って、型I
はcontiguous_iterator
のモデルである。
to_address(a) == addressof(*a)
to_address(b) == to_address(a) + D(b - a)
to_address(c) == to_address(a) + D(c - a)
例
#include <iostream>
#include <concepts>
#include <iterator>
#include <vector>
#include <forward_list>
#include <list>
#include <deque>
template<std::contiguous_iterator I>
void f(const char* name) {
std::cout << name << " is contiguous_iterator" << std::endl;
}
template<typename I>
void f(const char* name) {
std::cout << name << " is not contiguous_iterator" << std::endl;
}
int main() {
f<int*>("int*");
f<const int*>("const int*");
f<std::vector<int>::iterator>("std::vector<int>::iterator");
std::cout << "\n";
f<int* const>("int* const");
f<std::forward_list<int>::iterator>("std::forward_list<int>::iterator");
f<std::list<int>::iterator>("std::list<int>::iterator");
f<std::deque<int>::iterator>("std::deque<int>::iterator");
f<std::istream_iterator<double>>("std::istream_iterator<double>");
f<std::ostream_iterator<double>>("std::ostream_iterator<double>");
}
出力
int* is contiguous_iterator
const int* is contiguous_iterator
std::vector<int>::iterator is contiguous_iterator
int* const is not contiguous_iterator
std::forward_list<int>::iterator is not contiguous_iterator
std::list<int>::iterator is not contiguous_iterator
std::deque<int>::iterator is not contiguous_iterator
std::istream_iterator<double> is not contiguous_iterator
std::ostream_iterator<double> is not contiguous_iterator
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1
- Visual C++: 2019 Update 6