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

问题描述

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

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

在此指定V 3次。有人会认为,在常见的用例中,可能存在重载的功能(尽管灵活性较低)。

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

VVeryLongNameLikeThis时,当变量具有相似的VeryLongNameLikeThis2时,第一种语法将变得难以编写,读取甚至出错。

问题:在 special 中,还有哪些其他语法可用于迭代,但是像上述的 common 用例(例如,只有一个对象V.begin()位于.end()之前,依此类推)?如果设计师选择不提供“速记”,他们的动机是什么?

解决方法

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

#include <ranges>

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

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

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

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

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

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

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