命名空间
变体
操作

std::counted_iterator

来自 cppreference.cn
< 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] 成员函数

构造一个新的 counted_iterator
(公共成员函数) [编辑]
赋值另一个 counted_iterator
(公共成员函数) [编辑]
访问底层迭代器
(公共成员函数) [编辑]
返回到末尾的距离
(公共成员函数) [编辑]
访问指向的元素
(公共成员函数) [编辑]
通过索引访问元素
(公共成员函数) [编辑]
递增或递减 counted_iterator
(公共成员函数) [编辑]

[edit] 非成员函数

比较到末尾的距离
(函数模板) [编辑]
检查到末尾的距离是否等于 ​0​
(函数模板) [编辑]
(C++20)
递增迭代器
(函数模板) [编辑]
(C++20)
计算两个迭代器适配器之间的距离
(函数模板) [编辑]
计算到末尾的有符号距离
(函数模板) [编辑]
(C++20)
将解引用底层迭代器的结果强制转换为其关联的右值引用类型
(函数) [编辑]
(C++20)
交换两个底层迭代器指向的对象
(函数模板) [编辑]

[edit] 辅助类

std::counted_iterator 类型的属性提供统一的接口
(类模板特化) [编辑]

[edit] 示例

#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 }

[edit] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
P2259R1 C++20 未提供成员 typedef std::incrementable_traits
counted_iterator 进行了特化
添加成员 typedef 以解决 iterator_traits 修复
移除冗余的 std::incrementable_traits 特化

[edit] 参见

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