微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 C++11 中创建一系列索引的迭代器?

如何解决如何在 C++11 中创建一系列索引的迭代器?

我正在使用一个 API,它采用开始和结束迭代器,并在该范围内的对象上运行异步工作。但是,在一种情况下,我想迭代对象的索引,而不是对象(从 0 到 myVector.size() - 1)。我可以为这些索引创建一个简单的向量并使用其 .begin() 和 .end() 迭代器,但这会带来无法接受的性能开销。

创建两个迭代器的最简单方法是什么?从第一个迭代到第二个迭代器,您可以从 0 到 N?

解决方法

如果您可以访问 C++20,那么您可以使用 std::views::iota/std::ranges::iota_view 来获取整数序列:

std::vector<SomeType> vec = ...
auto index_sequence = std::views::iota(std::size_t{0},vec.size());
some_function_needing_iterators(std::begin(index_sequence),std::end(index_sequence));

Live Demo


在以前的标准下,您可以非常轻松地编写自己的数字范围迭代器;它只需要一些样板:

template <typename T>
class NumericRangeIterator
{
public:
    using difference_type = std::ptrdiff_t;
    using value_type = T;
    using pointer = T const*;
    using reference = T const&;
    using iterator_category = std::bidirectional_iterator_tag;

    explicit NumericRangeIterator(T n) : n_{n} {}

    reference operator*() const
    {
        return n_;
    }

    pointer operator->() const
    {
        return &n_;
    }

    NumericRangeIterator& operator++()
    {
        ++n_;
        return *this;
    }

    NumericRangeIterator operator++(int)
    {
        return NumericRangeIterator{n_++};
    }

    NumericRangeIterator operator--()
    {
        --n_;
        return *this;
    }

    NumericRangeIterator operator--(int)
    {
        return NumericRangeIterator{n_--};
    }

    bool operator==(const NumericRangeIterator& other) const
    {
        return n_ == other.n_;
    }

    bool operator!=(const NumericRangeIterator& other) const
    {
        return !(*this == other);
    }

private:
    T n_;
};

int main() {
    std::vector<int> vec = ...;
    some_function_needing_iterators(
        NumericRangeIterator{size_t{0}},NumericRangeIterator{vec.size()}
    );
}

Live Demo

,

创建两个迭代器的最简单方法是什么?从第一个迭代到第二个迭代器,您可以从 0 到 N?

您似乎在描述 std::ranges::iota_view。使用 beginend 获取您要查找的迭代器对。

在 C++11 中

不幸的是,std::ranges::iota_view 是在 C++20 中引入的,而原始库 range_v3 需要 C++14。

但是,同样的想法还有其他实现,例如 boost::counting_iterator 可以在 C++11 中使用。

或者,如果您想从头开始编写迭代器,您可以查看提到的预先存在的实现是如何实现的。编写自定义迭代器涉及大量样板文件,但这是可以编写的最简单的迭代器之一。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。