使用range-v3

时间:2019-08-08 10:12:38

标签: c++ c++17 c++20 range-v3

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

// 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

1 个答案:

答案 0 :(得分:3)

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

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

keys.resize(3);

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

或者,我认为更可取(您可以使keys const):

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

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