gpt4 book ai didi

c++ - 序列迭代器?没有一个在boost吗?

转载 作者:IT老高 更新时间:2023-10-28 23:01:46 24 4
gpt4 key购买 nike

有时我觉得需要某种迭代器(除了这个问题标题的前缀之外,我无法为它起一个好名字)。

假设我们有一个将整数映射到类型 T 的函数(或函数对象)。也就是说,我们有一个数学序列的定义,但我们实际上并没有将它存储在内存中。我想用它做一个迭代器。迭代器类看起来像这样:

template <class F, class T>
class sequence_iterator : public std::iterator<...>
{
int i;
F f;
public:
sequence_iterator (F f, int i = 0):f(f), i(i){}
//operators ==, ++, +, -, etc. will compare, increment, etc. the value of i.
T operator*() const
{
return f(i);
}
};

template <class T, class F>
sequence_iterator<F, T> make_sequence_iterator(F f, int i)
{
return sequence_iterator<F, T>(f, i);
}

也许我太天真了,但我个人觉得这个迭代器会非常有用。例如,假设我有一个检查数字是否为素数的函数。我想计算区间 [a,b] 中素数的数量。我会这样做;

int identity(int i)
{
return i;
}
count_if(make_sequence_iterator<int>(identity, a), make_sequence_iterator<int>(identity, b), isPrime);

既然我发现了一些有用的东西(至少恕我直言),我绝对肯定它存在于 boost 或标准库中。我就是找不到。那么,在 boost 中有这样的东西吗?。万一实际上没有,那么我将写一个 - 在这种情况下,我想知道您是否应该制作 iterator_category random_access_iterator_tag。我担心这不是真正的 RAI,因为 operator* 不返回引用。

提前感谢您的帮助。

最佳答案

boost::counting_iteratorboost::transform_iterator 应该可以解决问题:

template <typename I, typename F>
boost::transform_iterator<
F,
boost::counting_iterator<I>>
make_sequence_iterator(I i, F f)
{
return boost::make_transform_iterator(
boost::counting_iterator<I>(i), f);
}

用法:

std::copy(make_sequence_iterator(0, f), make_sequence_iterator(n, f), out);

关于c++ - 序列迭代器?没有一个在boost吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com