使用 range-v3 进行转换
Transform using 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
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
限定引用传递,以避免不必要的复制。
我正在使用范围尝试下面的代码,但它不起作用。
// 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
的概念,参见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
限定引用传递,以避免不必要的复制。