如何解决C ++迭代器,替代语法?
对于某些可迭代的对象V,通常在此语法上使用此语法(此处为std :: transform)
std::transform(V.begin(),V.end(),V.begin(),/*somelamda*/ );
在此指定V 3次。有人会认为,在常见的用例中,可能存在重载的功能(尽管灵活性较低)。
std::transform(V,/*somelamda*/ );
当V
是VeryLongNameLikeThis
时,当变量具有相似的VeryLongNameLikeThis2
时,第一种语法将变得难以编写,读取甚至出错。
问题:在 special 中,还有哪些其他语法可用于迭代,但是像上述的 common 用例(例如,只有一个对象V
且.begin()
位于.end()
之前,依此类推)?如果设计师选择不提供“速记”,他们的动机是什么?
解决方法
.begin()
-.end()
模式的冗长性是一个众所周知的(次要)问题。 C ++ 20将减轻这种情况:
#include <ranges>
std::ranges::transform(V,dest.begin(),/* some function */);
但是请注意,第二个参数是强制性的(与您的代码段相反),因为始终需要转换结果的目的地。在C ++ 20之前,您可以使用范围库,例如Boost range或range-v3。
对于问题的第二部分,最显着的迭代范围是基于循环的范围:
for (const auto& element : V)
/* do stuff */;
当在(平坦的)地图上进行迭代时,它特别优雅,因为它可以与结构化绑定结合使用:
for (const auto& [key,value] : someMap)
/* do stuff */;
这些构造在幕后使用功能模板std::begin
和std::end
(它们分派给相应的成员函数,例如容器)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。