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

新手上路,请多包涵

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

我该如何解决?

原文由 Oblomov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

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

原文由 Mário Feroldi 发布,翻译遵循 CC BY-SA 4.0 许可协议

您的代码有几个问题:

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

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

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

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

原文由 odyss-jii 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题