使用范围 v3 进行转换

Transform using range-v3

本文关键字:转换 v3 使用范围      更新时间:2023-10-16

我正在使用范围尝试在代码下面,但它不起作用。

// Code
std::map<int, std::string> m{ {1,"foo"},{42,"bar"},{7,"baz"} };
std::vector<int> keys;
// without using ranges
std::transform(begin(m), end(m), std::back_inserter(keys), [](auto val)
{
return val.first;
});

工作正常。但

// with using ranges
ranges::transform(m,std::back_inserter(keys), [](auto val)
{
return val.first;
});

它不适用于范围??

我正在使用 MSVC 2017 15.9.14

range-v3 不支持std::back_insert_iterator,因为它不满足库Iterator概念,请参阅此问题。正如讨论中指出的那样,这应该用 C++20 修复。

您可以通过以下任一方式解决此问题

keys.resize(3);
ranges::transform(m, keys.begin(), [](auto val) { return val.first; });

或者,在我看来更可取(因为您可以keysconst

(:
const std::vector<int> keys = m |
ranges::view::transform([](auto val){ return val.first; });

作为旁注,请考虑将 lambda 参数作为const限定引用传递,以避免不必要的复制。