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

use*_*212 5 c++

我试图初始化std :: vector

std::vector<Particle> particles;
Run Code Online (Sandbox Code Playgroud)

与简单结构的实例

struct Particle {
    int id;
    double x;
    double y;
    double theta;
    double weight;
};
Run Code Online (Sandbox Code Playgroud)

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

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

但是我得到了错误

C2660"std :: vector> :: emplace_back":函数不接受一个参数

我该如何解决这个问题?

ody*_*jii 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)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

注意那里的构造函数.然后安装,例如在开始时[只是一个不插入后面的例子(见下文)]:

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);
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所指出的,如果您只是想在不指定向量中的特定位置的情况下插入,则可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • `Particle` 是一个聚合,所以它不需要构造函数。 (2认同)
  • @MM @NathanOliver 那么你为什么要使用`emplace`? (2认同)

Már*_*ldi 6

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在这种情况下,的参数是type 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});
}
Run Code Online (Sandbox Code Playgroud)

  • 一旦必须构造类型的对象,就可以很好地使用`push_back`而不是`emplace_back`。嵌入的全部目的是允许就地构造所包含的元素。 (9认同)