迭代器只产生一个值?

时间:2016-10-15 14:20:52

标签: c++ c++17

一些STL算法(以及在其他环境中可以想到的类似STL的算法)通过迭代器获取它们的输入。我有时会发现自己想要传递一个(const)迭代器作为它们的输入之一,它只是保持产生相同的值(或者对内存中相同值的const引用)。例如,您可以使用std::fillstd::copy_n来实现std::distance(假设您的目标已结束)。

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

注意:我不是在谈论一个const迭代器,而是一个永远不会前进并继续产生同样事物的迭代器。

3 个答案:

答案 0 :(得分:2)

只需创建一个实现forward iterator interface的类,其解除引用运算符将​​返回您的单个值。

答案 1 :(得分:0)

此示例实现了最简单的迭代器接口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(...);
    }
};

答案 2 :(得分:0)

对于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));
}