在使用迭代器时,如何避免一直写smth.begin(), smth.end()?应该这样做吗?例如,如果你必须使用std::reverse-它看起来像这样:
smth.begin(), smth.end()
std::reverse
std::reverse(mystr.begin(), mystr.end());
但我想我在什么地方看到人们也在做同样的事情:
std::<somethig>::reverse(mystr);
3zwjbxry1#
您要从<algorithm>标头查找std::ranges::reverse()。因此,缺少的命名空间是ranges,它需要支持c++20或更高版本的编译器。
<algorithm>
std::ranges::reverse()
ranges
#include <algorithm> std::ranges::reverse(mystr);
还可以查看<algorithm>中的其他range算法,以及<ranges>中的适配器,了解它们可能也很有趣。例如,如果mystr只能以相反的顺序查看,则std::ranges::views::reverse / std::ranges::reverse_view适配器更合适。
<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 };
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);
2条答案
按热度按时间3zwjbxry1#
您要从
<algorithm>
标头查找std::ranges::reverse()
。因此,缺少的命名空间是
ranges
,它需要支持c++20或更高版本的编译器。还可以查看
<algorithm>
中的其他range算法,以及<ranges>
中的适配器,了解它们可能也很有趣。例如,如果
mystr
只能以相反的顺序查看,则std::ranges::views::reverse
/std::ranges::reverse_view
适配器更合适。qvtsj1bj2#
正如其他人提到的,从C++20开始,您就可以使用Ranges library。
对于早期版本,您可以使用预处理器宏,例如:
或者,使用自己的 Package ,例如: