在 c 中返回 std::vector 的有效方法

新手上路,请多包涵

在函数中返回 std::vector 时复制了多少数据,以及将 std::vector 放在自由存储区(在堆上)并返回指针而不是:

 std::vector *f()
{
  std::vector *result = new std::vector();
  /*
    Insert elements into result
  */
  return result;
}

比:

 std::vector f()
{
  std::vector result;
  /*
    Insert elements into result
  */
  return result;
}

?

原文由 Morten 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 714
2 个回答

在 C++11 中,这是首选方式:

 std::vector<X> f();

即按值返回。

对于 C++11, std::vector 具有移动语义,这意味着在函数中声明的 局部 向量将在返回时 _移动_,在某些情况下,编译器甚至可以忽略移动。

原文由 Nawaz 发布,翻译遵循 CC BY-SA 3.0 许可协议

以下代码将在没有复制构造函数的情况下工作:

你的日常:

 std::vector<unsigned char> foo()
{
    std::vector<unsigned char> v;
    v.resize(16, 0);

    return std::move(v); // move the vector
}

之后,您可以使用 foo 例程获取向量而不复制自身:

 std::vector<unsigned char>&& moved_v(foo()); // use move constructor

结果:moved_v 大小为 16,并由 [0] 填充

原文由 Dmitry Tuchin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题