首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中返回对象列表的最佳方式是什么?

在C++中返回对象列表的最佳方式是什么?
EN

Stack Overflow用户
提问于 2009-02-05 07:24:59
回答 7查看 39.9K关注 0票数 24

自从我用C++编程以来已经有一段时间了,从python回来后,我感觉自己穿着一件笔挺的夹克,好吧,我不会咆哮。

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

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

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

到目前为止一切都还好,项目规模很小,这似乎不会影响性能,但我仍然想得到一些关于这方面的输入/建议,因为我感觉我是在用C++编写python。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-02-05 07:33:06

我能看到的唯一一件事就是你强行复制了你返回的列表。这样做会更有效率:

代码语言:javascript
复制
  void DoSomething(const std::vector<SomeType>& in, std::vector<SomeType>& out)
  {
  ...
  // no need to return anything, just modify out
  }

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

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

票数 18
EN

Stack Overflow用户

发布于 2009-02-05 09:51:28

如果你真的需要一个新的列表,我会简单的返回它。在大多数情况下,返回值优化将不会处理不必要的副本,并且您的代码将保持非常清晰。

也就是说,获取列表并返回其他列表确实是C++中的python编程。

对于C++来说,更合适的范例是创建接受一系列迭代器并改变底层集合的函数。

例如:

代码语言:javascript
复制
void DoSomething(iterator const & from, iterator const & to);

(迭代器可能是一个模板,这取决于你的需求)

然后,链接操作就是在begin(),end()上调用连续的方法。如果你不想改变输入,你可以先自己复制一份。

代码语言:javascript
复制
std::vector theOutput(inputVector);

这一切都来自于C++的“不要为你不需要的东西付费”的哲学,你只会在你真正想要保留原件的地方创建副本。

票数 13
EN

Stack Overflow用户

发布于 2009-02-05 12:26:59

我会使用通用的方法:

代码语言:javascript
复制
template <typename InIt, typename OutIt>
void DoMagic(InIt first, InIt last, OutIt out)
{
  for(; first != last; ++first) {
    if(IsCorrectIngredient(*first)) {
      *out = DoMoreMagic(*first);
      ++out;
    }
  }
}

现在你可以调用它了

代码语言:javascript
复制
std::vector<MagicIngredients> ingredients;
std::vector<MagicResults> result;

DoMagic(ingredients.begin(), ingredients.end(), std::back_inserter(results));

您可以轻松地更改使用的容器,而无需更改使用的算法,而且返回容器也不会产生任何开销。

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

https://stackoverflow.com/questions/514908

复制
相关文章

相似问题

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