我有一个结构
typedef struct myStruct {
std::vector<std::vector<int>> something;
std::complex<double> const &x;
std::complex<double> const &y;
unsigned int const z;
unsigned int const w;
unsigned int const m;
} myStruct;
然后我基于这种结构创建了双端队列:
std::deque<myStruct> deq;
现在,我想填充一个新函数,向此双端队列添加一个新条目:
void newFunction(...){
deq.insert(...);
}
如何填充此函数以将新条目添加到双端队列,即myStruct类型?我的问题是我在struct类型中有一些引用,但无法弄清楚该怎么做。
谢谢
答案 0 :(得分:1)
您的类型myStruct
没有构造函数-不是您已声明的构造函数(因为尚未声明),也不是编译器为您综合的构造函数(因为它没有办法知道)。 / p>
当然可以使用聚合初始化来创建该类型的对象,这是您留下的唯一途径:
std::complex<double> x, y;
myStruct obj = {{}, x, y, 1, 2, 3};
您现在应该可以从中复制出一个双端队列元素:
deq.push_back(obj);
但是在类型具有构造函数之前,您将无法使用emplace_back
进行就地构造。
您可以使用emplace_back
来调用合成的移动构造函数:
deq.emplace_back(std::move(obj));
但是您仍然想要适合您的类型的构造函数。
此外,由于myStruct
包含const
个成员,因此它不是可复制分配的。因此,由于其他一些原因,该类型的设计不适合在标准容器中使用。
我对在一个对象内存储“原始”引用然后将该对象放入容器感到紧张。是什么确保了这些引用的有效性?
最后,以不必要的typedef
惯用语停止。这是我们早在1820年代在C语言中所做的事情,因此我们可以在各处使用类型myStruct
代替struct myStruct
;在C ++中,myStruct
是一个类,您可以直接命名它而无需任何技巧。有时,当人们也需要将自己的类也包含在C源代码中时(例如出于兼容性考虑),他们会坚持使用typedef
技巧,但是对于std::vector
和std::complex
成员,您肯定不会这样做。
答案 1 :(得分:0)
您可以执行以下操作:
首先,结构中的构造函数将初始化所有元素。
myStruct(std::vector<std::vector<int>> v,
std::complex<double> const &x,
std::complex<double> const &y,
unsigned int const z,
unsigned int const w,
unsigned int const m): something(v), x(x), y(y), z(z), w(w), m(m) {}
接下来,在您的newFunction
中,使用emplace_back
在双端队列的末尾插入一个元素。
std::vector<std::vector<int>> v; //Initialize this vector if required.
std::complex<double> const x = {1.0, 2.0}; //Example
std::complex<double> const y = {1.0, 2.0};
unsigned int const z = 10;
unsigned int const w = 20;
unsigned int const m = 30;
deq.emplace_back(v, x, y, z, w, m);