我尝试初始化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;: 函数不接受一个参数
我该如何解决?
答案 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);
您可以使用insert
或push_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});