从函数返回stl容器

Jur*_*aho 13 c++ containers stl

从函数返回stl容器的最佳方法(性能方面)是什么?返回的容器通常包含数千个项目.

方法1:

typedef std::list<Item> ItemContainer;

ItemContainer CreateManyItems() {
    ItemContainer result;

    // fill the 'result' ...

    return result;
}

ItemContainer a = CreateManyItems();
Run Code Online (Sandbox Code Playgroud)

方法2:

void CreateManyItems(ItemContainer &output) {
    ItemContainer result;

    // fill the 'result' ...

    output.swap(result);
} 

ItemContainer a;
CreateManyItems(a);
Run Code Online (Sandbox Code Playgroud)

方法3:

void std::auto_ptr<ItemContainer> CreateManyItems() {
    std::auto_ptr<ItemContainer> result(new ItemContainer);

    // fill the 'result' ...

    return result;
}

std::auto_ptr<ItemContainer> a = CreateManyItems();
Run Code Online (Sandbox Code Playgroud)

还是有更好的方法吗?

Naw*_*waz 9

如果您只想填充std::list项目,则可以使用,std::fill或者您可以使用或std::fill_n或或标准算法功能的组合.

由于不清楚您希望填写列表的具体内容是什么/如何,因此无法准确评论您的代码.除非您执行使用标准算法函数无法完成的非常特殊或复杂的操作,否则请使用标准算法函数.如果他们没有帮助你,那么只有第一种方法,编译器可能会优化代码中的返回值,从而消除不必要的副本,因为大多数编译器都实现了RVO.

在维基百科上查看以下主题:

在stackoverflow本身看到这些有趣的主题:

戴夫亚伯拉罕的一篇文章:


我仍然会强调这一点:你看过标题提供的所有通用函数<algorithm>吗?如果没有,那么我建议你首先查看它们,看看它们中的任何一个(或它们的组合)是否可以在你的代码中做你想做的事情.

如果要创建并填充列表,则可以使用std::generate()std::generate_n运行.


Tam*_*más 6

我通常使用方法4(几乎与方法2相同):

void fill(ItemContainer& result) {
    // fill the 'result'
}

ItemContainer a;
fill(a);
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是可能的,但不提供强大的异常安全性.这就是为什么我更喜欢方法2. (2认同)
  • 这正是优化编译器将为方法1执行的操作. (2认同)