只产生单个值的迭代器
Iterator which only ever yields a single value?
一些STL算法(以及在其他上下文中可以想到的类似STL的算法)通过迭代器获取输入。我有时发现自己想要传递一个(const)迭代器作为它们的输入之一,它只是不断产生相同的值(或const引用到内存中的相同值)。例如,您可以使用它来使用std::copy_n
和std::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));
}
相关文章:
- 为什么以及如何C++更改旧迭代器的值
- 将多个 for 循环组合成单个迭代器
- 如何修复使用矢量和迭代器打印值的错误
- enable_if检查迭代器的值类型是否为一对
- 复制映射迭代器对值的省略
- 使用迭代器将值插入嵌套地图
- STL SET 迭代器赋值 没有可行的候选者
- C++:使用clang编译以迭代器为值的映射时出现巨大错误
- 迭代器丢失值
- 指向矢量迭代器返回值的指针
- 如何获取 std::multimap 给定键"previous"项的迭代器(或值)?
- 输入迭代器的值初始化
- 只产生单个值的迭代器
- 试图获取vector迭代器的值时出现总线错误10
- 查找迭代器的值类型
- c++编程:将迭代器赋值给vector时出错
- 如何通过decltype声明迭代器的值
- 当泛化STL容器不知道迭代器的值类型时,如何使用模板化迭代器
- STL映射输出迭代器查找值
- 在 2D 矢量上使用迭代器打印值