在 std::vector 中放置一个聚合

Emplace an aggregate in std::vector

本文关键字:一个 vector std      更新时间:2023-10-16

我试图初始化 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 "std::vector>::emplace_back": 函数不接受一个参数

我该如何解决这个问题?

std::vector::emplace也需要一个迭代器作为参数,因为它在该迭代器的位置之前插入元素。

另一个问题是您的{i, 0.0, 0.0, 1}初始化不起作用,因为它不在告诉它需要实例化什么类型的上下文中。没有任何上下文的原因是由于具有泛型参数的emplaceemplace_back成员函数。

如果只想将元素追加到向量,请使用 emplace_back

但是,emplace_back取决于具有有效构造函数的元素类型才能工作,因为元素是通过括号初始化的。这在 C++20 中发生了变化,现在允许通过括号进行聚合初始化,而无需定义有效的构造函数。

因此,在 C++17 之前,您的示例将更改为:

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

在 C++20 及更高版本中,您可以改为执行以下操作:

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

您的代码存在多个问题:

  • 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);
}

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

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

其次,即使您提供职位。不会为initializer_lists推断模板类型。请参阅initializer_list和模板类型推断。因此,以下同样会失败

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});

放置或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});