在C++中,每当一个函数创建许多(数百或数千个)值时,我过去常常要求调用者传递一个数组,然后我的函数将输出值填充到该数组中:
void computeValues(int input, std::vector<int>& output);
因此,该函数将使用计算出的值填充向量output
。但是,我现在意识到这并不是真正良好的C++风格。
以下函数签名更好,因为它不承诺使用std::vector
,而可以使用任何容器:
void computeValues(int input, std::insert_iterator<int> outputInserter);
现在,调用者可以使用一些“插入器”进行调用:
std::vector<int> values; // or could use deque, list, map, ...
computeValues(input, std::back_inserter(values));
再次强调,我们不会承诺专门使用std::vector
,这很好,因为用户可能只需要std::set
等中的值。(我应该通过值还是引用传递iterator
?)
我的问题是:使用insert_iterator
是正确或标准的方法吗?还是有更好的方法?
编辑:我编辑了问题,以明确我不是在谈论返回两个或三个值,而是数百或数千个值。(想象一下你需要返回某个目录中找到的所有文件,或者图中的所有边缘等情况。)