首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Range-v3转换临时向量

使用Range-v3转换临时向量
EN

Stack Overflow用户
提问于 2020-11-21 08:34:09
回答 1查看 173关注 0票数 4

我已经做了很多关于range-v3视图,动作,以及它们如何与临时集合交互的阅读,但我仍然觉得我遗漏了一些简单的东西,可以帮助我完成我认为应该工作的事情。

假设有以下情况:

代码语言:javascript
复制
std::vector<int> get_vector() { return {1, 2, 3}; }

void func1()
{
  auto const v1 =
    get_vector() |
    ranges::view::transform([](auto const& i) { return i + 1; }) |
    ranges::to_vector;
}

我收到一条错误消息:

代码语言:javascript
复制
error: use of deleted function

还有一条值得一读的好消息:

代码语言:javascript
复制
// **************************************************************************
// *    When piping a range into an adaptor, the range must satisfy the     *
// *    "viewable_range" concept. A range is viewable when either or both   *
// *    of these things are true:                                           *
// *      - The range is an lvalue (not a temporary object), OR             *
// *      - The range is a view (not a container).                          *
// **************************************************************************

这是有道理的,但是我不想将get_vector返回的向量保存到一个命名变量中。我不需要它。我只想要一个由transformto_vector创建的新矢量。

我不喜欢将临时变量赋给左值,因为我觉得这会使它们合法化,在我看来,在这一行代码之后,我想要销毁临时向量。我不想让数据挂在那里。我不想让它有名字。我不想让下一位开发人员意外地认为他们可以使用它。

我想最让我抓狂的部分是我觉得这应该行得通。将临时变量传递给函数是C++的主要工作。我猜因为我没有创建一个我想要保存的视图,比如说,range-v3可能不是适合这项工作的库。

我尝试了几个我读过的其他组合。例如ranges::views::cache1

代码语言:javascript
复制
void func1()
{
  auto const v1 =
    get_vector() |
    ranges::views::cache1 |
    ranges::views::transform([](auto const& i) { return i + 1; }) |
    ranges::to_vector;
}

但是得到了相同的错误。我用同样的错误尝试过的其他组合:

代码语言:javascript
复制
void func1()
{
  auto const v1 =
    get_vector() |
    ranges::views::transform([](auto const& i) { return i + 1; }) |
    ranges::views::cache1 |
    ranges::to_vector;
}

和:

代码语言:javascript
复制
void func1()
{
  auto const v1 =
    get_vector() |
    ranges::views::cache1 |
    ranges::views::transform([](auto const& i) { return i + 1; }) |
    ranges::views::cache1 |
    ranges::to_vector;
}

我尝试使用操作,但遇到以下错误:

代码语言:javascript
复制
// *    When piping a range into an action, the range must be moved in.     *

这对我来说没有多大意义,因为临时向量已经是一个右值。

我遗漏了什么?我现在就是个笨蛋。

EN

回答 1

Stack Overflow用户

发布于 2020-11-21 13:38:19

正如错误消息所说,当通过管道将范围传送到适配器时,您需要范围是l值或视图。

get_vector返回的临时向量不属于上述任何一类。一种解决方法是将其赋给一个l值,如下所示:

代码语言:javascript
复制
void func1()
{
    auto&& vec = get_vector();
    
    auto const v1 = 
      vec |
      ranges::views::transform([](auto const& i) { return i + 1; }) |
      ranges::to_vector;
}

这是一个demo

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

https://stackoverflow.com/questions/64938645

复制
相关文章

相似问题

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