【发布时间】:2021-08-06 00:26:21
【问题描述】:
与老式的迭代器相比,我很难理解 c++20 范围增加了什么。是的,我想不再需要使用begin 和end,而是简单的重载,例如:
namespace std {
template <typename Container>
auto transform(Container&& container, auto&&... args) requires ( requires {container.begin(); container.end(); }) {
return transform(container.begin(), container.end(), args...);
}
}
会解决这个问题。
与迭代器相比,范围为什么有用以及何时应该使用它们?
编辑:我知道范围比迭代器有其他优势(链接、更好的方法等......)。然而,这些(我认为?)都可以用迭代器来完成,我不明白为什么需要引入一个全新的概念,比如范围。
【问题讨论】:
-
这是一个很好的问题,我自己也在努力寻找答案。
-
“也可以用迭代器完成” 但不太方便。按照同样的逻辑,我们应该用纯 C 编写,因为它可以做 C++ 可以做的任何事情,等等。
-
@SomeProgrammer 不,你不能。因为单个迭代器只是信息的一半。您不能链接迭代器。
it | transform(f)为您提供了一个适配的迭代器,但您还需要适配 end 迭代器才能执行任何操作。能够做任何事情是不够的。想象一下这看起来像......filter -
@SomeProgrammer 哦,所以你是说你需要一个范围?
-
@SomeProgrammer: "我认为你可以重载管道操作符,以便迭代器可以像范围一样链接方法。" 如果是这种情况,请提供一些证据.在您的问题中添加一些代码,以了解链接和其他范围操作如何在普通迭代器上工作。
标签: c++ iterator c++20 std-ranges