如何在std ::: vector中设置结构

时间:2017-04-13 14:23:02

标签: c++

我尝试初始化std :: vector

std::vector<Particle> particles;

使用简单结构的实例

struct Particle {
    int id;
    double x;
    double y;
    double theta;
    double weight;
};

使用带有初始化列表的emplace:

num_particles = 1000;
for (int i = 0; i < num_particles; i++)
{
    particles.emplace_back({ i,0.0,0.0,0.0,1 });
}

但是我收到了错误

  

C2660&#34; std :: vector&gt; :: emplace_back&#34;:   函数不接受一个参数

我该如何解决?

3 个答案:

答案 0 :(得分:7)

您的代码有几个问题:

  • Emplace将迭代器作为插入点,然后将值列表作为构造函数的参数。

  • 你的结构必须有一个构造函数,它将你传递给的值传递给emplace。

  • 您的代码中只有4个参数值,但您的Particle结构有5个字段。

请尝试使用此代码:

struct Particle {
    int id;
    double x;
    double y;
    double theta;
    double weight;

    Particle(int id, double x, double y, double theta, double weight) 
        : id(id), x(x), y(y), theta(theta), weight(weight)
    {
    }
};

注意那里的构造函数。然后安抚,例如在开头[只是一个没有插入后面的例子(见下文)]:

std::vector<Particle> particles;

auto num_particles = 1000;
for (int i = 0; i < num_particles; i++)
{
    particles.emplace(particles.begin(), i, 0.0, 0.0, 1.0, 0.0);
}

正如其他人所说,如果您只是想在不指定向量中的特定位置的情况下插入,则可以使用emplace_back

std::vector<Particle> particles;

auto num_particles = 1000;
for (int i = 0; i < num_particles; i++)
{
    particles.emplace_back(i, 0.0, 0.0, 1.0, 0.0);
}

这会将元素插入向量的末尾。

答案 1 :(得分:5)

std::vector::emplace期望迭代器也作为参数,因为它在迭代器的位置之前插入元素。如果您只想将元素附加到矢量,请使用emplace_back。另一个问题是{ i,0.0,0.0,1 }事件是初始化列表,而不是Particle。如果要实例化Particle结构,则需要告诉编译器:Particle{ i, 0.0, 0.0, 1 }。编辑:那是因为emplace_back期望参数稍后构造Particle结构,所以你的尝试将不起作用,因为参数本身将被推断为初始化列表。

另一方面,std::vector::push_back在这种情况下的参数是Particle类型,所以在这里你可以传递那个init-list,因为构造像这样的对象叫做聚合初始化(即Particle p = {i, 0.0, 0.0, 1}有效)。

最终代码:

for (int i = 0; i < num_particles; i++)
{
    particles.push_back({i, 0.0, 0.0, 1});
}

答案 2 :(得分:4)

首先,std::vector::emplace要求传递的第一个参数是一个迭代器,表示应该插入元素的位置。

其次,即使你提供了这个职位。不会推断 initializer_lists 的模板类型。 见initializer_list and template type deduction。因此,下面同样失败

particles.emplace( particles.end(), {i, 0.0, 0.0, 1, 1});

由于没有可以使用初始化列表的构造函数,下面同样会失败

particles.emplace( particles.end(), i, 0.0, 0.0, 1, 1);

您可以使用insertpush_back,如下所示:

particles.insert( particles.end(), {i, 0.0, 0.0, 1, 1});
particles.push_back({i, 0.0, 0.0, 1, 1});

或emplace或push_back:

particles.emplace( particles.end(), Particles{i, 0.0, 0.0, 1, 1});
particles.emplace_back(Particles{i, 0.0, 0.0, 1, 1});