在 std::vector 中放置一个聚合
Emplace an aggregate in 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": 函数不接受一个参数
我该如何解决这个问题?
std::vector::emplace
也需要一个迭代器作为参数,因为它在该迭代器的位置之前插入元素。
另一个问题是您的{i, 0.0, 0.0, 1}
初始化不起作用,因为它不在告诉它需要实例化什么类型的上下文中。没有任何上下文的原因是由于具有泛型参数的emplace
和emplace_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);
您可以使用insert
或push_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});
- 在c++中用vector填充一个简单的动态数组
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 访问 std:vector 的类成员 std:vector 在一个类中与另一个 std:vector
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 从 std::vector 中选择一个元素,而不是给定元素
- 使用 glDrawElements 绘制一个 std::vector
- 为什么 vector 的方法调整大小会创建一个额外的对象?
- 当涉及到一个序列时,"vector[n].push_back()"总是O(1)吗?
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 重新排序 vector<std::unique_ptr<X>>给定一个 vector<const X*>
- OpenCV,findContours - 为什么我们需要一个<vector<vector<Point>>来存储轮廓?为什么不直接<矢量<Point>&
- 在c++中,一个vector是否占用连续的内存槽?
- 在c++ 11中,这是将一个std::vector的内容移动到另一个vector的末尾的最有效的方法吗?
- 一个vector必须存储两个size吗?
- 一个vector/map中的函数变量参数
- 是否在c++中返回一个vector
- 将指定的vector内容复制到另一个vector