c ++迭代器,替代语法?
c++ iterators, alternative syntax?
对于某些可迭代的对象 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()
模式的冗长是一个 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::begin
和 std::end
(它们分派给相应的成员函数,例如容器)。
对于某些可迭代的对象 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()
模式的冗长是一个 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::begin
和 std::end
(它们分派给相应的成员函数,例如容器)。