从 c++ 中的函数返回向量的最佳方法是什么
What is the best way to return a vector from a function in c++
我有一个函数,它返回一个这样的数组:
vector<string> GetString()
{
vector<string> s;
s.push_back("one");
s.push_back("two");
s.push_back("three");
return s;
}
我这样称呼它:
vector<string> mystrings=GetStrings();
我也可以按如下方式实现它:
void GetString(vector<string> & s)
{
s.push_back("one");
s.push_back("two");
s.push_back("three");
}
并以此方式调用它:
vector<string> mystrings;
GetStrings(mystrings);
哪一个更好?
版本一是否会将向量复制到另一个版本?如果是,那么如果向量很大,则速度很慢。
哪一个更好?
他们做不同的事情。如果您想要一个只包含这些字符串的向量,请使用第一个;如果希望能够将这些字符串追加到现有向量,请使用第二个。
如果你想要第一个版本的语义,那么从更容易正确使用和更难错误使用的角度来看,这是"更好的"。
版本一是否将向量复制到另一个版本?
在现代C++中,绝对不是:返回局部变量和从临时变量初始化都是通过移动而不是复制来完成的。即使您坚持使用 C++11 之前的编译器,也应该省略这两个副本。如果你的编译器不支持移动语义或复制省略,那么你真的应该把它扔掉。
这在很大程度上是个人偏好的问题,以及您可能需要使用的任何编码约定。
在C++11之前,第二种方法有时被认为是可取的。性能保证良好,因为没有不必要的复制。另一方面,第一种方法有可能(理论上)调用一个相当昂贵的复制构造函数。
但在实践中,称为复制省略的优化通常会避免使用复制构造函数,这意味着无论哪种方式,性能都一样好。但不能保证,因为它可能取决于编译器设置/功能等因素。
不过C++11引入了移动语义。它提供了一种消除复制的替代方法,并且内置于语言规范中(而不是可选的编译器优化)。从可读性的角度来看,这可以使第一个选项更可取,因为代码正在做什么可能更明显。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?