c++ - 如何在 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()}
);
}
推荐阅读
- amazon-web-services - 通过 Cloudformation (yaml) 创建配置修复规则时出错
- redux - (JS 库)redux-thunk 与 redux-saga
- c++ - 访问 LD_PRELOAD 共享库中的全局状态
- c++ - 方法是否被覆盖或重载?
- powershell - 如何以另一个用户的身份执行一行代码?
- angular - 从不同的服务器加载 Angular Bundle
- python - 为什么这两行代码在 Pytorch 中给了我不同的输出,这是否解释了奇怪的参数?
- selectinput - RShiny中用户选择输入的动态平均值
- javascript - 如何使用预定义函数关闭 JQuery 对话框?
- azure - Azure - 我应该在 Azure 函数还是逻辑应用中配置重试策略