【问题标题】:How to create input iterator over sequence of function results in C++?如何在 C++ 中的函数结果序列上创建输入迭代器?
【发布时间】:2023-04-01 03:15:01
【问题描述】:

我有一个获取一对输入迭代器的函数:

template<typename I>
void foo(I begin, I end) {...}

我想给它提供函数生成的序列 - 例如随机数序列。 是否有任何标准库机制来实现这一点,而无需将序列存储在集合中,然后从集合中获取迭代器?

【问题讨论】:

  • 我不想缩小问题的范围。我想要一对未存储在任何集合中的序列上的迭代器。
  • 标准库中有一个先例:istream_iterator。您可以按照相同的思路编写您的,但标准库中没有任何内容可以帮助您做到这一点。
  • 这个问题是否与您的问题足够相似以提供帮助? stackoverflow.com/questions/9059187/…

标签: c++


【解决方案1】:

您需要自己构建它。这是一个如何做的例子:

template<typename F>
class function_iterator {
    using function = F;
public:
    using value_type = std::invoke_result_t<function>;
    using difference_type = std::ptrdiff_t;
    using reference = value_type const&;
    using pointer = value_type const*;
    using iterator_category = std::input_iterator_tag;

    function_iterator(function f, difference_type pos = 0);

    auto operator*() const -> value_type;
    auto operator++() -> function_iterator&;
    auto operator++(int) -> function_iterator;

private:
    function f_;
    difference_type pos_;

    template<typename T_>
    friend bool operator==(function_iterator<T_> const& lhs, function_iterator<T_> const& rhs);
    template<typename T_>
    friend bool operator!=(function_iterator<T_> const& lhs, function_iterator<T_> const& rhs);
};

template<typename T>
function_iterator<T>::function_iterator(function f, difference_type pos) :
f_(f), pos_(pos) {
}

template<typename F>
auto function_iterator<F>::operator*() const -> value_type {
    return f_();
}
template<typename F>
auto function_iterator<F>::operator++() -> function_iterator& {
    ++pos_;
    return *this;
}
template<typename F>
auto function_iterator<F>::operator++(int) -> function_iterator {
    auto it = *this;
    ++*this;
    return it;
}

template<typename T_>
bool operator==(function_iterator<T_> const& lhs, function_iterator<T_> const& rhs) {
    return lhs.pos_ == rhs.pos_;
}
template<typename T_>
bool operator!=(function_iterator<T_> const& lhs, function_iterator<T_> const& rhs) {
    return !(lhs == rhs);
}

Live

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 2022-11-02
    • 1970-01-01
    • 2018-05-20
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多