对于某些可迭代的对象 V,对其进行迭代通常使用这种语法(这里使用 std::transform)
std::transform(V.begin(), V.end(), V.begin(), /*somelamda*/ );
这里 V 被指定了 3 次。人们会认为对于常见的用例可能存在重载(尽管不太灵活)的功能。std::transform(V, /*somelamda*/ );
当V
是 VeryLongNameLikeThis
当您有具有相似 VeryLongNameLikeThis2
的变量时,第一种语法变得难以编写、阅读甚至容易出错.问题:在上述特殊但常见的用例中,还有哪些其他语法可用于迭代(例如,只涉及一个对象
V
并且 .begin()
位于 .end()
之前等等)?如果设计师选择不提供“速记”,他们的动机是什么?
最佳答案
.begin()
的详细程度- .end()
模式是一个众所周知的(次要)问题。 C++20 将缓解这种情况:
#include <ranges>
std::ranges::transform(V, dest.begin(), /* some function */);
但请注意,第二个参数是强制性的(与您的代码片段相反),因为始终需要转换结果的目的地。在 C++20 之前,您可以使用范围库,例如Boost range或 range-v3 .对于您问题的第二部分,迭代范围最显着的易用性是基于范围的 for 循环:
for (const auto& element : V)
/* do stuff */;
这在迭代(平面) map 时特别优雅,因为它可以与结构化绑定(bind)相结合:for (const auto& [key, value] : someMap)
/* do stuff */;
这些构造使用函数模板 std::begin
和 std::end
在引擎盖下(调度到相应的成员函数,例如容器)。
关于c++迭代器,替代语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64240762/