gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:25 24 4
gpt4 key购买 nike

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

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

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

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

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

现在,调用者可以调用一些inserter:

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

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

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

编辑:我编辑了问题以明确我不是在谈论返回两个或三个值,而是返回数百或数千个值。 (假设您已经返回在某个目录中找到的所有文件,或者图中的所有边等)

最佳答案

对编辑的回应:好吧,如果您需要返回成百上千的 if 值,元组当然不是最佳选择。然后最好选择带有迭代器的解决方案,但最好不要使用任何特定的迭代器类型。


如果你使用迭代器,你应该尽可能通用地使用它们。在您的函数中,您使用了一个插入迭代器,如 insert_iterator< vector<int> > .你失去了任何通用性。这样做:

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

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

boost::tuple<int, bool, char> computeValues(int input) { 
....
}

如果值的数量是可变的,并且值的类型来自固定集合,例如 (int, bool, char),您可以查看 boost::variant 的容器。 .然而,这意味着仅在调用方发生变化。您可以保留上面的迭代器样式:

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

关于c++ - 如何从 C++ 函数返回数百个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com