c++ 在使用迭代器时,如何简化开始开始结束?

30byixjq  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(146)

在使用迭代器时,如何避免一直写smth.begin(), smth.end()?应该这样做吗?
例如,如果你必须使用std::reverse-它看起来像这样:

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

但我想我在什么地方看到人们也在做同样的事情:

std::<somethig>::reverse(mystr);
3zwjbxry

3zwjbxry1#

您要从<algorithm>标头查找std::ranges::reverse()
因此,缺少的命名空间是ranges,它需要支持c++20或更高版本的编译器。

#include <algorithm>

std::ranges::reverse(mystr);

还可以查看<algorithm>中的其他range算法,以及<ranges>中的适配器,了解它们可能也很有趣。
例如,如果mystr只能以相反的顺序查看,则std::ranges::views::reverse / std::ranges::reverse_view适配器更合适。

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

auto rev_v1 = std::ranges::views::reverse(mystr);
// or
std::ranges::reverse_view rev_v1{ mystr };
qvtsj1bj

qvtsj1bj2#

正如其他人提到的,从C++20开始,您就可以使用Ranges library
对于早期版本,您可以使用预处理器宏,例如:

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

std::reverse(BeginEndIters(mystr));

或者,使用自己的 Package ,例如:

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

MyNS::reverse(mystr);

相关问题