我试图初始化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":函数不接受一个参数
我该如何解决这个问题?
您的代码有几个问题:
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)
这会将元素插入向量的末尾.
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)
| 归档时间: |
|
| 查看次数: |
6072 次 |
| 最近记录: |