返回STL列表作为参数

Raf*_*ida 2 c++ stl list

我有一个函数从日志文件中读取行,将这些行转换为某个类并返回此类的实例的STL列表.

我应该如何声明这个函数,以便在将它归因于调用者时不复制整个列表?

不失一般性,假设:

list<Request> requests = log_manipulator.getAsRequestList();
Run Code Online (Sandbox Code Playgroud)

我该如何申报getAsRequestList()?我应该返回对列表的引用还是只返回一个列表?

这是一个严重的问题,因为在这个特定的赋值中,列表将包含大约1.5M的元素,因此这样的错误可能会增加内存使用量.

Ale*_*lli 14

不建议返回引用,返回列表对象将导致复制.最好的方法是更改​​方法的签名以接受并填充列表引用:

list<Request> requests;
log_manipulator.getRequestListByRef(requests);
Run Code Online (Sandbox Code Playgroud)

void getRequestListByRef(list<Request>&)作为方法的签名.


Sho*_*og9 10

你有两个简单的选择:

返回参数

void getAsRequestList(list<Request>& requests);
Run Code Online (Sandbox Code Playgroud)

...

list<Request> requests;
log_manipulator.getAsRequestList(requests);
Run Code Online (Sandbox Code Playgroud)

一个输出迭代器

template <class OutputIterator>
void getAsRequestList(OutputIterator dest);

...

list<Request> requests;
log_manipulator.getAsRequestList( 
   insert_iterator< list<Request> >(requests, requests.begin()) );
Run Code Online (Sandbox Code Playgroud)

另请参阅:如何从C++函数返回数百个值?

  • 输出迭代器是要走的路.传递对列表的引用会破坏通用性并且不是很酷. (2认同)

aib*_*aib 5

您可以通过返回一个简单的列表来逃避 - 搜索"返回值优化"以获取详细信息.简单地说,允许编译器生成绕过昂贵的复制构造函数的代码.

只有在尝试了这个并且对结果不满意之后,我才会推荐其他答案中建议的"填充"版本.这很丑陋.

当然,需要注意的是RVO并不能保证会发生.