我正在尝试下面的代码使用范围,但它不工作。
// 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
发布于 2019-08-08 18:27:54
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-qualified引用传递,以避免不必要的副本。
https://stackoverflow.com/questions/57410216
复制相似问题