如何在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));

实时演示


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

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()}
);
}

实时演示

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

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

C++11 中的

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

但是,同样的想法还有其他实现,比如在C++11中工作的boost::counting_iterator

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

最新更新