矢量类比方说,我们有A类:没有默认的构造函数
Class A
{
public:
A() = delete;
A(const int & y)
: x(y)
{}
private:
int x;
};
如何创建一个A
类型的std::vector
并给出一个参数A
的构造?我如何将3
添加到vector
?
矢量类比方说,我们有A类:没有默认的构造函数
Class A
{
public:
A() = delete;
A(const int & y)
: x(y)
{}
private:
int x;
};
如何创建一个A
类型的std::vector
并给出一个参数A
的构造?我如何将3
添加到vector
?
如何创建一个
A
类型的std::vector
并给出一个参数A
的构造?
std::vector<A> v1(10, 42); // 10 elements each with value 42
std::vector<A> v2{1,2,3,4}; // 4 elements with different values
我怎么会增加3到矢量?
v.emplace_back(3); // works with any suitable constructor
v.push_back(3); // requires a non-explicit constructor
缺乏一个默认的构造函数只意味着你不能这样做,需要一个操作,如
vector<A> v(10);
v.resize(20);
这两个插入默认构造的元素在载体中。
要添加到此答案中(并且请纠正我,如果我错了):为了第一个构造函数进行编译,必须存在从int的隐式转换'A'和一个赋值操作符。如果其中任何一个都不存在(问题中不是这种情况),它将不起作用。
@JorenHeit:差不多。它确实需要一个隐式转换构造函数;没有这些,你不得不说'A(42)'或'{42}',而不只是'42'。它还需要一个复制或移动构造函数(不是赋值运算符),但这是'vector'的一般要求。 –
诀窍在于如何将元素添加到向量中以及您使用的向量的成员函数。
std::vector<A> v;
v.emplace_back(3);
模板没有一次性实例化:它们只是实例化需要的东西。 A
满足了以下所有条件(构建空载体)是有效的:
std::vector<A> v;
然而,由于A
没有一个默认的构造函数,下面的(创建一个默认初始化内容载体)会失败:
std::vector<A> v(100);
这是一件好事。然而,有效的方法将被罚款实例:
v.emplace_back(42);
谢谢巴里!我永远不会将我的头围绕在这个单词上:p – Quentin
这是否要求过多试图在发布之前实际编译您的代码? 'Class','std :: vector ...'和'std :: vector v(100);'都是无稽之谈。 – Praetorian
它应该是std :: vector v(100),你是对的。我只是在这里写下这个代码,作为我的问题的一个小例子!抱歉不清楚。 –