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

标签 c++ syntax iterator language-design

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

std::transform(V.begin(), V.end(), V.begin(), /*somelamda*/ );
这里 V 被指定了 3 次。人们会认为对于常见的用例可能存在重载(尽管不太灵活)的功能。
std::transform(V, /*somelamda*/ );
VVeryLongNameLikeThis当您有具有相似 VeryLongNameLikeThis2 的变量时,第一种语法变得难以编写、阅读甚至容易出错.
问题:在上述特殊但常见的用例中,还有哪些其他语法可用于迭代(例如,只涉及一个对象 V 并且 .begin() 位于 .end() 之前等等)?如果设计师选择不提供“速记”,他们的动机是什么?

最佳答案

.begin() 的详细程度- .end()模式是一个众所周知的(次要)问题。 C++20 将缓解这种情况:

#include <ranges>

std::ranges::transform(V, dest.begin(), /* some function */);
但请注意,第二个参数是强制性的(与您的代码片段相反),因为始终需要转换结果的目的地。在 C++20 之前,您可以使用范围库,例如Boost rangerange-v3 .
对于您问题的第二部分,迭代范围最显着的易用性是基于范围的 for 循环:
for (const auto& element : V)
   /* do stuff */;
这在迭代(平面) map 时特别优雅,因为它可以与结构化绑定(bind)相结合:
for (const auto& [key, value] : someMap)
   /* do stuff */;
这些构造使用函数模板 std::beginstd::end在引擎盖下(调度到相应的成员函数,例如容器)。

关于c++迭代器,替代语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64240762/

相关文章:

c++ - 从带有迭代器参数的模板函数返回指针

C++将多大小数组存储在变量中

c++ - 未知的外部符号 _WinMainCRTStartup

c - 在基于 C 的语言中,从右到左和从左到右的关联性有什么后果?

syntax - 通过位置参数构造 F# 记录

java - 为什么在 Java 实例化过程中要对类命名两次?

java - 在 TreeSet O(1) 时间内获取最大元素?

c++ - 为什么当 int array[n] 无效时 new int[n] 有效?

c++ - 了解 break 语句并为现有代码处理它

c++ - 如何仅使用Iterator显示Vector的前10个元素?