将条目添加到双端队列c ++

时间:2018-10-16 09:20:08

标签: c++ populate deque

我有一个结构

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类型中有一些引用,但无法弄清楚该怎么做。

谢谢

2 个答案:

答案 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::vectorstd::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);