C++11 将向量传递给构造函数
C++11 pass vector to 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)} {}
最简单的方法是按值获取向量,然后移动它:
Foo (vector<int> vec) : _member{std::move(vec)} {}
与一对 const vector<int>&
/vector<int>&&
重载相比,您最多需要支付一次额外的移动(这对于向量来说非常便宜),但不必编写两个构造函数(如果您有多个参数,这可能会很快爆炸)。
按值传递是当今许多圈子的流行趋势。出于各种原因,我认为这对构造函数来说是一个不错的选择,所以我同意 T.C. 的答案。但是,传递参数(到非构造函数)的最佳方式的更广泛问题,我很少建议按值传递。我真的,非常强烈建议听听赫伯·萨特(Herb Sutter)关于这个话题的演讲的这一部分:https://youtu.be/xnqTKD8uD64?t=51m34s。
总而言之,在构造函数之外:与通过 const-ref 的简单传递相比,按值传递提供了更差的最坏情况性能保证,在所有情况下它提供的性能都比 const-ref/rvalue-ref 重载差,它使提供异常保证变得更加困难,它切片多态类型,当复制是有条件的时不能使用它。
在大多数情况下,你要么不在乎合理的表现,要么你非常关心。在第一种情况下,使用 const-ref 越来越容易。在第二种情况下,按值传递不够好。同样,请记住,构造函数由于几个不同的原因而不同(它们是移动构造事物而不是移动分配,它们接受许多参数,这些参数会强烈影响您需要的重载数量)。
不幸的是,这个问题没有这么简单的答案。最终这两种方法都足够好,但我认为要掌握C++,你想知道两者的优缺点。
在这种特殊情况下,您正在传递rvalue
因此第三种选择是最好的。
- 一对向量构造函数:初始值设定项列表与显式构造
- 在c++中使用向量时,如何调用构造函数和析构函数
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 通过构造函数创建的所有对象都具有相同的向量
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在 c++ 中具有向量的双向链表构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 使用向量初始化参数化构造函数的对象数组
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- 初始化构造函数C++中结构的向量
- 在具有向量的类构造函数中进行析构函数调用
- 在 c++ 的构造函数中分配对象向量时出错
- 在类和构造函数中使用向量时出现分段错误
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- C++:无法将向量传递给构造函数
- STL向量上出现奇怪的复制构造函数错误
- 使用所述填充构造函数初始化向量中的向量
- C++:在向量<int> vn{MyAllocator<int>(a)} 中调用哪些构造函数?
- 是否将std矢量重新分配到默认的构造函数向量是擦除的好方法