在C++中返回对象列表的最佳方法?

has*_*sen 21 c++ arrays memory-management

我用C++编程已经有一段时间了,来自python之后,我穿着直筒夹克感觉太棒了,好吧,我不会咆哮.

我有几个函数充当"管道",接受列表作为输入,返回另一个列表作为输出(基于输入),

这是概念,但在实践中,我std::vector用来表示列表,这是可以接受的吗?

更进一步,我没有使用任何指针,所以我std::vector<SomeType> the_list(some_size);用作变量,并直接返回,即return the_list;

PS到目前为止一切都还好,项目大小很小,这似乎并没有影响性能,但我仍然希望得到一些输入/建议,因为我觉得我在用C++编写python.

Big*_*ich 16

我唯一能看到的是你强制复制你返回的列表.做以下事情会更有效率:

  void DoSomething(const std::vector<SomeType>& in, std::vector<SomeType>& out)
  {
  ...
  // no need to return anything, just modify out
  }
Run Code Online (Sandbox Code Playgroud)

因为您传入要返回的列表,所以可以避免额外的副本.

编辑:这是一个旧的回复.如果您可以使用带有移动语义的现代C++编译器,则无需担心这一点.当然,如果你要返回的对象没有移动语义,这个答案仍然适用.

  • 实际上,大多数(如果不是全部)不太合适的C++编译器都支持RVO(返回值优化),它应该通过简单地转换代码来传递对返回容器的引用来处理"不必要的"副本.这是几乎每个编译器中都存在的少数优化之一. (9认同)
  • c ++ 1x将返回值移动到它们的目标.返回向量然后理想地等同于指针交换操作.对于c ++ 1x,我会按值获取参数,然后让它们从临时构造中移动构造(使用它们的移动构造函数),修改它们并将它们向前移动 (3认同)

Pie*_*ter 13

如果你真的需要一个新列表,我会简单地返回它.在大多数情况下,返回值优化将不会处理任何不必要的副本,并且您的代码保持清晰.
话虽如此,获取列表并返回其他列表确实是C++中的python编程.

对于C++,更合适的范例是创建采用一系列迭代器并改变底层集合的函数.

例如

void DoSomething(iterator const & from, iterator const & to);
Run Code Online (Sandbox Code Playgroud)

(根据您的需要,迭代器可能是模板)

然后链接操作是在begin(),end()上调用连续方法的问题.如果您不想更改输入,请先自行复制.

std::vector theOutput(inputVector);
Run Code Online (Sandbox Code Playgroud)

这一切都来自C++"不为你不需要的东西买单"的理念,你只需创建你想要保留原件的副本.