当前位置:  开发笔记 > 编程语言 > 正文

如何从C++函数返回数百个值?

如何解决《如何从C++函数返回数百个值?》经验,为你挑选了2个好方法。

在C++中,每当函数创建许多(数百或数千)个值时,我曾经让调用者传递一个数组,然后我的函数用输出值填充:

void computeValues(int input, std::vector& output);

因此,该函数将output使用它计算的值填充向量.但这并不是真正优秀的C++风格,正如我现在意识到的那样.

以下函数签名更好,因为它不承诺使用a std::vector,但可以使用任何容器:

void computeValues(int input, std::insert_iterator outputInserter);

现在,来电者可以与一些人打电话inserter:

std::vector values; // or could use deque, list, map, ...
computeValues(input, std::back_inserter(values));

同样,我们不承诺std::vector专门使用,这很好,因为用户可能只需要std::set等等的值(我应该传递iteratorby值还是引用?)

我的问题是:这是insert_iterator正确的还是标准的方式吗?还是有更好的东西?

编辑:我编辑了这个问题,以明确我不是在谈论返回两个或三个值,而是数百或数千.(想象一下,您已经返回在某个目录中找到的所有文件,或图表中的所有边缘等)



1> Johannes Sch..:

对编辑的回应:好吧,如果你需要返回数百和数千的值,那么一个元组当然不是可行的方法.最好用迭代器选择解决方案,但最好不要使用任何特定的迭代器类型.


如果使用迭代器,则应尽可能使用它们.在您的函数中,您使用了类似的插入迭代器insert_iterator< vector >.你失去了任何通用性.像这样做:

template
void computeValues(int input, OutputIterator output) {
    ...
}

无论你给它什么,它现在都会起作用.但如果在返回集中有不同的类型,它将无法工作.你可以使用元组.也可以std::tuple在下一个C++标准中使用:

boost::tuple computeValues(int input) { 
    ....
}

如果值的数量是可变的,并且值的类型来自固定集,如(int,bool,char),则可以查看容器boost::variant.然而,这仅意味着在呼叫方面的改变.您可以保持上面的迭代器样式:

std::vector< boost::variant > data;
computeValues(42, std::back_inserter(data));



2> Benoît..:

您可以返回一个指向矢量的智能指针.这应该工作,不会制作矢量的副本.

如果你不想为程序的其余部分保留智能指针,你可以在调用函数之前简单地创建一个向量,并交换两个向量.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有