我可以速记“开始..end“在使用迭代器时?

Can I shorthand writing "begin..end" when working with iterators?

提问人:synalice 提问时间:3/15/2023 最后编辑:TylerHsynalice 更新时间:3/30/2023 访问量:195

问:

在使用迭代器时,如何避免一直写作?smth.begin(), smth.end()

例如,如果您必须使用 – 它将如下所示:std::reverse

std::reverse(mystr.begin(), mystr.end());

但我想我在某个地方看到人们在做同样的事情:

std::<something>::reverse(mystr);
C++ 算法 迭代器 +-标准库 C +20

评论

6赞 user17732522 3/15/2023
<something> -> ranges.自 C++20 以来支持范围(和相应的算法重载)。

答:

11赞 JeJo 3/15/2023 #1

您正在从标头中查找 std::ranges::reverse()。<algorithm>

因此,缺少的命名空间是 ,它需要支持 或更高版本的编译器。ranges

#include <algorithm>

std::ranges::reverse(mystr);

还可以查看 <algorithm> 中的其他范围算法,以及 <ranges> 中的适配器,了解这些算法可能也很有趣。

例如,如果只能以相反的顺序查看,则更合适的是 std::ranges::views::reverse/ std::ranges::reverse_view 适配器。mystr

#include <ranges> // std::ranges::views::reverse

auto rev_v1 = std::ranges::views::reverse(mystr);
// or
std::ranges::reverse_view rev_v1{ mystr };
0赞 Remy Lebeau 3/16/2023 #2

正如其他人所提到的,您可以从 C++20 开始使用 Ranges 库

对于早期版本,您可以改用预处理器宏,例如:

#define BeginEndIters(c) (c).begin(), (c).end()

std::reverse(BeginEndIters(mystr));

或者,使用您自己的包装器,例如:

namespace MyNS {
    template<typename Container>
    void reverse(Container &c) {
        std::reverse(std::begin(c), std::end(c));
    }
}

MyNS::reverse(mystr);