std:: counted_iterator
From cppreference.net
|
定义于头文件
<iterator>
|
||
|
template
<
std::
input_or_output_iterator
I
>
class counted_iterator ; |
(C++20 起) | |
std::counted_iterator
是一种迭代器适配器,其行为与底层迭代器完全一致,不同之处在于它会跟踪到其范围末尾的距离。当且仅当计数归零时,该迭代器等于
std::default_sentinel
。
目录 |
成员类型
| 成员类型 | 定义 |
iterator_type
|
I
|
value_type
(条件性存在) |
std::
iter_value_t
<
I
>
若
I
满足
indirectly_readable
概念;否则未定义
|
difference_type
|
std:: iter_difference_t < I > |
iterator_concept
(条件性存在) |
I :: iterator_concept 若存在;否则未定义 |
iterator_category
(条件性存在) |
I :: iterator_category 若存在;否则未定义 |
成员对象
| 成员名称 | 定义 |
current
(private)
|
base()
所访问的基础迭代器
( 仅用于说明的成员对象* ) |
length
(private)
|
基础迭代器与其范围末尾之间的距离
( 仅用于说明的成员对象* ) |
成员函数
构造新的
counted_iterator
(公开成员函数) |
|
赋值另一个
counted_iterator
(公开成员函数) |
|
|
访问底层迭代器
(公开成员函数) |
|
|
返回到末尾的距离
(公开成员函数) |
|
|
访问指向的元素
(公开成员函数) |
|
|
通过索引访问元素
(公开成员函数) |
|
前进或后退
counted_iterator
(公开成员函数) |
非成员函数
|
(C++20)
|
比较到末尾的距离
(函数模板) |
检查到末尾的距离是否等于
0
(函数模板) |
|
|
(C++20)
|
前进迭代器
(函数模板) |
|
(C++20)
|
计算两个迭代器适配器之间的距离
(函数模板) |
|
计算到末尾的带符号距离
(函数模板) |
|
|
(C++20)
|
将底层迭代器解引用结果转换为其关联的右值引用类型
(函数) |
|
(C++20)
|
交换两个底层迭代器所指向的对象
(函数模板) |
辅助类
|
为
std::counted_iterator
类型的属性提供统一接口
(类模板特化) |
示例
运行此代码
#include <algorithm> #include <iostream> #include <iterator> #include <string> #include <vector> using std::operator""s; void print(auto const remark, auto const& v) { const auto size = std::ssize(v); std::cout << remark << '[' << size << "] { "; for (auto it = std::counted_iterator{std::cbegin(v), size}; it != std::default_sentinel; ++it) std::cout << *it << (it.count() > 1 ? ", " : " "); std::cout << "}\n"; } int main() { const auto src = {"Arcturus"s, "Betelgeuse"s, "Canopus"s, "Deneb"s, "Elnath"s}; print("src", src); std::vector<decltype(src)::value_type> dst; std::ranges::copy(std::counted_iterator{src.begin(), 3}, std::default_sentinel, std::back_inserter(dst)); print("dst", dst); }
输出:
src[5] { Arcturus, Betelgeuse, Canopus, Deneb, Elnath }
dst[3] { Arcturus, Betelgeuse, Canopus }
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| DR | 适用范围 | 发布时的行为 | 修正后的行为 |
|---|---|---|---|
| P2259R1 | C++20 |
未提供成员类型定义
std::incrementable_traits 为
counted_iterator
进行了特化
|
添加成员类型定义以适配
iterator_traits
修正
移除冗余的 std::incrementable_traits 特化 |
参见
|
(C++20)
|
用于知晓其范围边界的迭代器的默认哨兵
(类) |
|
(C++20)
|
通过迭代器和计数创建子范围
(定制点对象) |
|
(C++20)
|
由另一个
view
的前N个元素组成的
view
(类模板) (范围适配器对象) |