简体   繁体   English

使用range-v3进行转换

[英]Transform using range-v3

I am trying below code using ranges but it doesn't working. 我正在尝试使用范围下面的代码,但它不起作用。

// 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;
});

which is working fine. 工作正常。 But, 但,

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

it is not working with ranges?? 它不适用于范围吗?

I am using MSVC 2017 15.9.14 我正在使用MSVC 2017 15.9.14

The range-v3 doesn't support std::back_insert_iterator , because it doesn't satisfy the library Iterator concept, see this issue . range-v3不支持std::back_insert_iterator ,因为它不满足库Iterator概念,请参见此问题 As it's pointed out in the discussion, this is supposed to be fixed with C++20. 正如讨论中指出的那样,这应该在C ++ 20中修复。

You can fix this by either 您可以通过以下任一方法解决此问题

keys.resize(3);

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

or, in my opinion preferable (as you can make keys const ): 或者,我认为更可取(因为您可以使keys const ):

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

As a side note, consider passing the lambda parameter as a const -qualified reference to avoid unnecessary copies. 作为附带说明,请考虑将lambda参数传递为const限定的引用,以避免不必要的复制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM