是否有一个容器适配器可以反转迭代器的方向,所以我可以使用基于范围的for循环反向迭代一个容器?
使用显式迭代器,我会将其转换为:
for (auto i = c.begin(); i != c.end(); ++i) { ...
进入这个:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
我想转换这个:
for (auto& i: c) { ...
对此:
for (auto& i: std::magic_reverse_adapter(c)) { ...
有这样的事情还是我必须自己写?
7 回答
实际上Boost确实有这样的适配器:boost::adaptors::reverse .
实际上,在C 14中,可以用很少的代码行完成 .
这与@Paul的解决方案非常相似 . 由于C 11中缺少的东西,该解决方案有点不必要地膨胀(加上std气味中的定义) . 多亏了C 14,我们可以让它更具可读性 .
关键的观察是基于范围的for循环依赖于
begin()
和end()
来获取范围的迭代器 . 感谢ADL,甚至不需要在std :: namespace中定义自定义begin()
和end()
.这是一个非常简单的示例解决方案:
这就像一个魅力,例如:
按预期打印
NOTE
std::rbegin()
,std::rend()
和std::make_reverse_iterator()
尚未在GCC-4.9中实施 . 我根据标准编写这些示例,但它们不会在稳定的g中编译 . 然而,为这三个函数添加临时存根非常容易 . 这是一个示例实现,绝对不完整,但在大多数情况下运行良好:UPDATE 22 Oct 2017
感谢estan指出这一点 .
原始答案示例实现使用
using namespace std;
,这将导致包含此实现(必须在头文件中)的任何文件也导入整个std
命名空间 .修改了示例实现以建议
using std::rbegin, std::rend
.这应该在C 11中有效,没有提升:
这对你有用吗:
例如:
如果不使用C 14,那么我在下面找到最简单的解决方案 .
Demo .
它没有
begin/rbegin, end/rend
函数 .您可以简单地使用向后迭代的BOOST_REVERSE_FOREACH . 例如,代码
生成以下输出:
4
3
2
1
0