【发布时间】:2021-04-08 08:47:51
【问题描述】:
是否有容器适配器可以反转迭代器的方向,以便我可以使用基于范围的 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)) { ...
有这样的东西还是要我自己写?
【问题讨论】:
-
一个反向容器适配器,听起来很有趣,但我认为你必须自己编写它。如果标准委员会快点采用基于范围的算法而不是显式迭代器,我们就不会遇到这个问题。
-
@deft_code:“而不是?”为什么要摆脱基于迭代器的算法?对于不从
begin迭代到end或处理流迭代器等的情况,它们要好得多,也不那么冗长。范围算法会很棒,但它们实际上只是迭代器算法的语法糖(除了延迟评估的可能性)。 -
@deft_code
template<typename T> class reverse_adapter { public: reverse_adapter(T& c) : c(c) { } typename T::reverse_iterator begin() { return c.rbegin(); } typename T::reverse_iterator end() { return c.rend(); } private: T& c; };可以改进(添加const版本等)但它可以工作:vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;打印321 -
@SethCarnegie:添加一个漂亮的函数形式:
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}那么你可以使用for(auto &i: reverse_adapt_container(v)) cout << i;进行迭代。 -
@C.R:我不认为它应该是这个意思,因为这会使它无法作为一种简洁的语法用于顺序很重要的循环。 IMO 简洁性比您的语义含义更重要/更有用,但是如果您不重视 c 的简洁性,您的样式指南可以给出您想要的任何含义。这就是
parallel_for的用途,如果它以某种形式被纳入标准,那么“我不在乎什么顺序”的条件会更强。当然它也可以有一个基于范围的语法糖 :-)
标签: c++ c++11 ranged-loops