首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用range-v3进行转换

使用range-v3进行转换
EN

Stack Overflow用户
提问于 2019-08-08 18:12:39
回答 1查看 394关注 0票数 2

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

代码语言:javascript
复制
// 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;
});

运行得很好。但,

代码语言:javascript
复制
// with using ranges
ranges::transform(m,std::back_inserter(keys), [](auto val)
{
    return val.first;
});

它不适用于范围??

我正在使用MSVC 2017 15.9.14

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-08 18:27:54

range-v3不支持std::back_insert_iterator,因为它不满足库Iterator的概念,请参阅this issue。正如在讨论中指出的,这个问题应该用C++20解决。

您可以通过以下任一方法来修复此问题

代码语言:javascript
复制
keys.resize(3);

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

或者,在我看来更好(因为您可以使keys const):

代码语言:javascript
复制
const std::vector<int> keys = m |
    ranges::view::transform([](auto val){ return val.first; });

作为附注,请考虑将lambda参数作为const-qualified引用传递,以避免不必要的副本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57410216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档