一些STL算法(以及在其他环境中可以想到的类似STL的算法)通过迭代器获取它们的输入。我有时会发现自己想要传递一个(const)迭代器作为它们的输入之一,它只是保持产生相同的值(或者对内存中相同值的const引用)。例如,您可以使用std::fill
和std::copy_n
来实现std::distance
(假设您的目标已结束)。
那么,标准库或其中一个TS在任何地方(C ++ 17或更早版本)都有这个吗?
注意:我不是在谈论一个const迭代器,而是一个永远不会前进并继续产生同样事物的迭代器。
答案 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));
}