Namespaces
Variants

std:: counted_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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

目录

成员类型

成员类型 定义
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
(公开成员函数)

非成员函数

比较到末尾的距离
(函数模板)
检查到末尾的距离是否等于 ​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 特化

参见

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