1 并允许非随机访问反向迭代器-6ren"> 1 并允许非随机访问反向迭代器-抱歉问题措辞。如果您能想到更好的方式来表达问题,请进行编辑。 要一次一步地遍历 std::vector v,我们有很多选择。以下是一些立即浮现在脑海中的内容: 1. for ( auto & elem-6ren">
gpt4 book ai didi

C++ 迭代器 "for loop"习惯用法,步长 > 1 并允许非随机访问反向迭代器

转载 作者:太空狗 更新时间:2023-10-29 20:33:34 35 4
gpt4 key购买 nike

抱歉问题措辞。如果您能想到更好的方式来表达问题,请进行编辑。

要一次一步地遍历 std::vector v,我们有很多选择。以下是一些立即浮现在脑海中的内容:

1. for ( auto & elem : v )
2. for ( int i = 0 ; i < v.size() ; ++i )
3. for ( auto begin = v.begin() ; begin < v.end() ; begin++ )

现在我想将讨论限制在基于迭代器的方法上,因为我最终会对其他容器感兴趣。例如,假设我有一个方法可以接受 beginend 迭代器:

template <typename Iterator>
void foo( Iterator begin, Iterator end ){
for ( ; begin < end ; begin++ ){
...
}
}

问题是这不适用于更通用的容器,因为我们不能简单地为所有容器递增迭代器。好的,让我们解决这个问题:

template <typename Iterator>
void foo( Iterator begin, Iterator end ){
for ( ; begin < end ; std::advance( begin, 1 ) ){
...
}
}

啊哈,但是还有另一个问题,特别是,如果有人给了我们一个反向迭代器会发生什么......好吧。如果我们担心这一点,我们可以简单地将其更改为

template <typename Iterator>
void foo( Iterator begin, Iterator end ){
for ( ; begin != end ; std::advance( begin, 1 ) ){
...
}
}

这是我的问题...我现在如何适应大于 1 的步长,同时承认我可以有一个反向的、非随机访问的迭代器?

具体来说,我可以在以下代码中插入最轻量级的测试:

template <typename Iterator>
void foo( Iterator begin, Iterator end, const size_t step ){
for ( ; test(begin, end) ; std::advance( begin, step ) ){
...
}
}

编辑:

有人指出,如果我越过容器的末尾,advance 函数可能未定义。该错误也需要修复。

最佳答案

这是一个以给定步长执行迭代并在每次增量后检查终止条件的模板。它还使用取消引用的迭代器调用函数。

template <typename Iterator, typename Fct>
void foo(Iterator begin, Iterator end, std::size_t step, const Fct& f) {
if (begin == end)
return;

while (true) {
f(*begin);

for (std::size_t i = 0; i < step; ++i)
if (++begin == end)
return;
}
}

这应该适用于任何非随机访问迭代器,例如

const auto print = [](const auto& arg){ std::cout << arg << "\n";  };

std::list<int> l{42, 43, 44, 45, 46};

foo(l.crbegin(), l.crend(), 3, print);

或者例如带有输入迭代器。

foo(std::istream_iterator<char>(std::cin), std::istream_iterator<char>(), 2, print);

关于C++ 迭代器 "for loop"习惯用法,步长 > 1 并允许非随机访问反向迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54343636/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com