gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:58:09 26 4
gpt4 key购买 nike

对于某些可迭代的对象 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com