只产生单个值的迭代器

Iterator which only ever yields a single value?

本文关键字:迭代器 单个值      更新时间:2023-10-16

一些STL算法(以及在其他上下文中可以想到的类似STL的算法)通过迭代器获取输入。我有时发现自己想要传递一个(const)迭代器作为它们的输入之一,它只是不断产生相同的值(或const引用到内存中的相同值)。例如,您可以使用它来使用std::copy_nstd::distance来实现std::fill(假设您有目标的末端)。

那么,标准库或TS中的一个在任何地方(c++ 17或更早)都有这个吗?

注意:我说的不是const迭代器,而是一个永远不会前进并始终产生相同结果的迭代器。

创建一个实现前向迭代器接口的类,其解引用操作符返回单个值

这个例子实现了最简单的迭代器接口std::iterator。

签名中的ssize_t参数是用于差异的类型,因为即使在STL中也没有固定:)

返回多少值由operator ==的行为与end()方法返回的值一起定义。

template <typename E>
class IteratorExample
{
    ...
    struct StlIterator
    {
        ...
        const E & operator * ()
        {
            ...
        }
        const E * operator -> ()
        {
            return &(operator * ());
        }
        StlIterator & operator ++ ()
        {
            ...
        }
        StlIterator & operator ++ (int)
        {
            ...
        }
        bool operator == (const StlIterator &other)
        {
            ...
        }
        bool operator != (const StlIterator &other)
        {
            return (operator == (other)) == false;
        }
        typedef E value_type;
        typedef size_t difference_type;
        typedef E * pointer;
        typedef E & reference;
        typedef std::input_iterator_tag iterator_category;
    };
    StlIterator begin() const
    {
        return StlIterator(...);
    }
    StlIterator end() const
    {
        return StlIterator(...);
    }
};

对于copy_n,第一个参数应满足InputIterator的要求。然而,下面的例子是一个最小的工作实现,缺少InputIterator的一些要求:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
template <typename T, T t>
struct It:public std::iterator<std::input_iterator_tag, T>
{
    constexpr auto& operator++() const{
        return *this;
    }
    constexpr auto& operator+(size_t) const{
        return *this;
    }
    constexpr auto operator*() const{
        return t;
    }
};

int main(){
 //an iterator with constant value of 1
    It<int,1> in;
    std::vector<int> out;
    std::copy_n(in, 4, std::back_inserter(out));
}