C ++ 11将向量传递给构造函数

时间:2016-01-14 20:37:19

标签: c++ c++11 vector constructor

我整天都在阅读关于传递参数的最有效方法,我很困惑。我想传递这样的矢量:

Foo f({1,2,3});

我只是想用传递的向量初始化我的 _member 变量。现在的问题是我的构造函数应该如何显示:

// pass by value
Foo (vector<int> vec) : _member{vec} {}

// const reference
Foo (const vector<int>& vec) : _member{vec} {}

// rvalue reference
Foo (vector<int>&& vec) : _member{std::move(vec)} {}

3 个答案:

答案 0 :(得分:11)

最简单的方法是按值取矢量,然后移动它:

Foo (vector<int> vec) : _member{std::move(vec)} {}

与一对const vector<int>& / vector<int>&&重载相比,你需要支付一个额外的移动(对于向量来说非常便宜),但不必编写两个构造函数(可能会爆炸)如果您有多个参数,请很快。)

答案 1 :(得分:2)

现在很多圈子里的价值传递很流行。我认为出于各种原因,它对于施工人员来说是个不错的选择,所以我同意T.C。的回答。但是,更广泛的问题是传递参数(到非构造函数)的最佳方法,我很少建议按值传递。我非常非常强烈建议您听一下Herb Sutter关于这个话题的部分内容:https://youtu.be/xnqTKD8uD64?t=51m34s

总结一下,在构造函数之外:与const-ref简单传递相比,pass by value给出了更糟糕的最坏情况性能保证,它在所有情况下都比const-ref / rvalue-ref重载性能更差,这使得它变得更难为了提供异常保证,它会切割多态类型,在复制是有条件的时候不能使用它。

在大多数情况下,你要么在合理范围内不关心表现,要么你在乎。在第一种情况下,使用const-ref更简单,更容易。在第二种情况下,传递值不够好。再次,请记住构造函数由于几个不同的原因而不同(它们是移动构造事物而不是移动分配,它们会采用许多参数来强烈影响所需的重载次数。)

不幸的是,这个问题没有这么简单的答案。最终这两种方法都足够好,但我认为掌握C ++你想知道两者的优缺点。

答案 2 :(得分:0)

在这种特殊情况下,您传递的是rvalue,因此第三种选择是最好的。