std::counted_iterator
来自 cppreference.com
定义在头文件 <iterator> 中 |
||
template< std::input_or_output_iterator I > class counted_iterator; |
(自 C++20 起) | |
std::counted_iterator
是一个迭代器适配器,其行为与底层迭代器完全相同,只是它跟踪其范围结束的距离。 此迭代器等于 std::default_sentinel 当且仅当其计数达到零。
内容 |
[edit] 成员类型
成员类型 | 定义 |
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 如果存在;否则,未定义 |
[edit] 成员对象
成员名称 | 定义 |
current (私有) |
底层迭代器,base() 访问(仅供说明的成员对象*) |
length (私有) |
底层迭代器与其范围结束之间的距离 (仅供说明的成员对象*) |
[edit] 成员函数
(C++20) |
构造一个新的迭代器适配器 (公共成员函数) |
(C++20) |
分配另一个迭代器适配器 (公共成员函数) |
(C++20) |
访问底层迭代器 (公共成员函数) |
(C++20) |
返回到结尾的距离 (公共成员函数) |
(C++20) |
访问指向的元素 (公共成员函数) |
(C++20) |
通过索引访问元素 (公共成员函数) |
前进或后退迭代器 (公共成员函数) |
[edit] 非成员函数
(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 (类模板) (范围适配器对象) |