命名空间
变体
操作

std::counted_iterator

来自 cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
算法概念和实用程序
间接可调用概念
通用算法要求
(C++20)
(C++20)
(C++20)
实用程序
(C++20)
迭代器适配器
counted_iterator
(C++20)

范围访问
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
定义在头文件 <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] 成员函数

构造一个新的迭代器适配器
(公共成员函数) [edit]
(C++20)
分配另一个迭代器适配器
(公共成员函数) [edit]
(C++20)
访问底层迭代器
(公共成员函数) [edit]
(C++20)
返回到结尾的距离
(公共成员函数) [edit]
访问指向的元素
(公共成员函数) [edit]
通过索引访问元素
(公共成员函数) [edit]
前进或后退迭代器
(公共成员函数) [edit]

[edit] 非成员函数

比较到结尾的距离
(函数模板) [edit]
检查到结尾的距离是否等于 ​0​
(函数模板) [edit]
(C++20)
前进迭代器
(函数模板) [edit]
(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 特化已被删除

[编辑] 另请参阅

用于知道其范围边界的迭代器的默认哨兵
(类) [编辑]
从迭代器和计数创建子范围
(定制点对象)[编辑]
一个由另一个view 的前 N 个元素组成的view
(类模板) (范围适配器对象)[编辑]