提问人:synalice 提问时间:3/15/2023 最后编辑:TylerHsynalice 更新时间:3/30/2023 访问量:195
我可以速记“开始..end“在使用迭代器时?
Can I shorthand writing "begin..end" when working with iterators?
问:
在使用迭代器时,如何避免一直写作?smth.begin(), smth.end()
例如,如果您必须使用 – 它将如下所示:std::reverse
std::reverse(mystr.begin(), mystr.end());
但我想我在某个地方看到人们在做同样的事情:
std::<something>::reverse(mystr);
答:
11赞
JeJo
3/15/2023
#1
您正在从标头中查找 std::ranges::reverse()。
<algorithm>
因此,缺少的命名空间是 ,它需要支持 c++20 或更高版本的编译器。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);
评论
<something>
->ranges
.自 C++20 以来支持范围(和相应的算法重载)。