首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++11中创建一系列索引的迭代器?

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

Stack Overflow用户
提问于 2021-06-27 02:57:41
回答 2查看 190关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-27 04:17:09

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

代码语言:javascript
运行
复制
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));

现场演示

根据以前的标准,您可以很容易地编写自己的数字范围迭代器;它只需要一点样板:

代码语言:javascript
运行
复制
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()}
    );
}

现场演示

票数 3
EN

Stack Overflow用户

发布于 2021-06-27 04:00:03

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

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

在C++11中

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

但是,在boost::counting_iterator中也有同样的实现,比如C++11。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68147621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档