C++ 如何创建结构向量并在以后初始化它们

C++ 如何创建结构向量并在以后初始化它们,c++,qt,vector,C++,Qt,Vector,为了便于处理,我想创建一个自定义元素的向量,之后可以通过a[0]等轻松访问该向量。问题是每个元素都有一个非空构造函数,即我不能写 elem A; 相反,我必须写作 elem A(int a, int b, int c); 在创建过程中使用a、b、c固定值。但这对我来说是不可能的,因为我在运行时获取这些元素的值。 那么,有没有办法做到这一点: Vector<elem> A; elem B(int a, int b, int c); A.push_back(B); BlackLib

为了便于处理,我想创建一个自定义元素的向量,之后可以通过
a[0]
等轻松访问该向量。问题是每个元素都有一个非空构造函数,即我不能写

elem A;
相反,我必须写作

elem A(int a, int b, int c);
在创建过程中使用a、b、c固定值。但这对我来说是不可能的,因为我在运行时获取这些元素的值。
那么,有没有办法做到这一点:

Vector<elem> A;
elem B(int a, int b, int c);
A.push_back(B);
BlackLib是来自的BBB引脚扩展的数据类型

解决方案:

使用
std::vector A

与您编写的方式非常接近。你能行

#include <vector>

...

std::vector<B> A;
B foo(a, b, c);
A.push_back(foo);
对于
std::vector
,这很容易解决:

vec.emplace_uback(std::make\u unique());///C++14
vec.emplace_-back(标准::唯一_-ptr(新B));//C++11
//这些功能也可以工作,并对push_back执行相同的操作
…但你必须记住去做

那么,有没有办法做到这一点:

 vector<elem> A;
 elem B(int a, int b, int c);
 A.push_back(B);
向量A;
元素B(内部a、内部B、内部c);
A.推回(B);
如果是,怎么做

对。有一些可能性。首先,检查一下后面的位置。它类似于push-back,但参数直接传递给被保持对象的构造函数(完美转发):

向量A;
A.安置在后面(A,b,c);//对于现有的元素::elem(inta,intb,intc)
您还可以依赖elem的复制构造函数,在模型之后构造n个元素:

elem model{ a, b, c };
vector<elem> A{ 10, model }; // create 10 elements equal to model
elem模型{a,b,c};
向量A{10,model};//创建10个与模型相同的图元

是的,我得到一个错误,告诉我“候选者期望3个参数,得到0”。在哪段代码中?在
向量Aelem
为可默认构造的代码>。演示:这不是“完整的代码”,我不熟悉BlackLib,但粗略地看一下代码,我就会认为它不适合这个用例。BlackGPIO类持有指向堆数据的裸指针,但没有用户定义的复制或移动构造函数。这将导致双重自由。实际上,这应该在BlackLib中修复,但是作为一种解决方法,您可以使用
std::vector
并执行
a.emplace_back(新的BlackLib::BlackGPIO(…)
这意味着我必须添加自己的构造函数?我必须在之后释放一些东西吗(因为使用了new?)我对unique_ptr不太熟悉,因此我在问(当只使用向量时,我不需要释放一些东西)。
std::unique_ptr
为你这样做——这是它生活中的唯一目的。@Wintermute,
emplace_back(新…
如果向量尝试重新分配并抛出
bad_alloc
std::vector<std::unique_ptr<B> > vec;

vec.emplace_back(new B); // is not exception-safe if the vector has to 
                         // relocate and might throw bad_alloc, in which case
                         // the newly allocated foo object is leaked because
                         // no one is responsible for cleaning it up.

vec.push_back(new B);    // does not compile
vec.emplace_back(std::make_unique<B>());     // C++14
vec.emplace_back(std::unique_ptr<B>(new B)); // C++11

// these also work and do the same thing with push_back
 vector<elem> A;
 elem B(int a, int b, int c);
 A.push_back(B);
vector<elem> A;
A.emplace_back(a, b, c); // for an existing elem::elem(int a, int b, int c)
elem model{ a, b, c };
vector<elem> A{ 10, model }; // create 10 elements equal to model