c ++迭代器,替代语法?

c++ iterators, alternative syntax?

对于某些可迭代的对象 V,对其进行迭代通常使用此语法(此处使用 std::transform)

std::transform(V.begin(), V.end(), V.begin(), /*somelamda*/ );

这里V被指定了3次。人们会认为对于常见用例可能存在重载(尽管不太灵活)函数。

std::transform(V, /*somelamda*/ );

VVeryLongNameLikeThis 时,第一个语法变得难以编写、阅读,甚至当您具有类似 VeryLongNameLikeThis2.

的变量时甚至容易出错

问题:在 specialcommon 类似的用例中,还有哪些其他语法可用于迭代(例如,哪里有只有一个对象 V 涉及并且 .begin().end() 之前等等)?如果设计师选择不提供“速记”,他们的动机是什么?

.begin()-.end() 模式的冗长是一个 well-known(次要)问题。 C++20 将减轻这种情况:

#include <ranges>

std::ranges::transform(V, dest.begin(), /* some function */);

但请注意,第二个参数是必需的(与您的代码段相反),因为始终需要转换结果的目的地。在 C++20 之前,您可以使用范围库,例如Boost range or range-v3.

对于问题的第二部分,迭代范围最显着的易用性是基于范围的 for 循环:

for (const auto& element : V)
   /* do stuff */;

在(平面)地图上迭代时特别优雅,因为它可以与结构化绑定结合使用:

for (const auto& [key, value] : someMap)
   /* do stuff */;

这些构造在幕后使用函数模板 std::beginstd::end(它们分派给相应的成员函数,例如容器)。