gpt4 book ai didi

c++ - 返回一堆值的接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 12:50:09 26 4
gpt4 key购买 nike

我有一个函数,它接受一个数字并返回很多东西(比如整数)。最干净的界面是什么?一些想法:

  1. 返回 vector<int> . vector 会被复制多次,效率很低。
  2. 返回 vector<int>* .我的 getter 现在必须分配 vector 本身以及元素。有谁必须释放 vector 的所有常见问题,事实上你不能分配一次并为许多不同的 getter 调用使用相同的存储,等等。这就是为什么 STL 算法通常避免分配内存,而不是想要它通过了。
  3. 返回 unique_ptr<vector<int>> .现在很清楚是谁删除了它,但我们还有其他问题。
  4. 拍下vector<int>作为引用参数。 setter/getter 可以push_back()调用者可以决定是否 reserve()空间。但是,如果传入 vector,getter 应该怎么做?是非空的?附加?通过先清除来覆盖?断言它是空的?如果函数的签名只允许单一解释,那就太好了。
  5. 通过 beginend迭代器。现在我们需要返回实际写入的项目数(可能比预期的要少),调用者需要注意不要访问从未写入过的项目。
  6. 让 getter 获取 iterator , 调用者可以传递 insert_iterator .
  7. 放弃,直接通过 char * . :)

最佳答案

在 C++11 中,标准容器支持移动语义,您应该使用选项 1

它使你的函数的签名清晰,传达你只想返回一个整数 vector ,这将是高效的,因为不会发出拷贝:std::vector< 的移动构造函数 将被调用(或者,很可能,将应用命名返回值优化,导致不移动也不复制):

std::vector<int> foo()
{
std::vector<int> v;
// Fill in v...
return v;
}

这样您就不必处理诸如所有权、不必要的动态分配以及其他只会影响问题简单性的问题:返回一堆整数。

在 C++03 中,您可能希望使用选项 4 并获取对非 const vector 的左值引用:C++03 中的标准容器没有移动感知,并且复制 vector 可能很昂贵。因此:

void foo(std::vector<int>& v)
{
// Fill in v...
}

但是,即使在这种情况下,您也应该考虑这种惩罚对于您的用例是否真的很重要。如果不是,您可能会选择更清晰的函数签名,但会牺牲一些 CPU 周期。

此外,C++03 编译器能够执行命名返回值优化,因此即使理论上应该从您返回的值复制构造一个临时值,但实际上不可能进行复制发生。

关于c++ - 返回一堆值的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16467429/

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