c++ - C++ 的向量如何分配内存
问题描述
考虑我的代码,我有向量 P,它的类型是粒子。然后在粒子内部也有向量x、v和xBest。
所以,它是向量中的向量。
struct Particle
{
vector<double> x;
vector<double> v;
vector<double> xBest;
double fitness;
double pBest;
};
class Swarm
{
public:
vector<Particle> P;
Swarm();
};
由于在声明类或结构时编译器不会让我为向量保留内存。像这样:
class Swarm
{
public:
vector<Particle> P(30);
Swarm();
};
所以,我在构造函数中这样做:
Swarm::Swarm()
{
P.reserve(30);
for(size_t i = 0; i < 30; i++)
{
P[i].x.reserve(10);
P[i].v.reserve(10);
P[i].xBest.reserve(10);
}
}
这是工作。
我对此非常好奇。由于struct Particle中向量的大小尚未初始化,因此 Particle 的大小是未知的。但是我甚至可以在为struct Particle中的 3 个向量保留内存之前为 30 个粒子保留内存!
这怎么可能?
解决方案
这是未定义的行为。当你reserve
是一个向量时,你不会创建对象,所以循环:
for(size_t i = 0; i < 30; i++)
{
P[i].x.reserve(10);
P[i].v.reserve(10);
P[i].xBest.reserve(10);
}
正在调用reserve
不存在的向量。
您不能在不存在的向量上保留容量。你需要先创建你Particle
的 s。
推荐阅读
- javascript - 将参数附加到数组并评估每个数组元素
- typescript - “属性或方法“foo”未在实例上定义,但在渲染期间被引用”Vuejs Typescript
- git - 合并 Git 存储库,保留历史记录和参考
- php - 如何在heroku上成功安装firebase?
- css - CSS中标题标签的每个单词的第一个字母大一点
- python - 使用 TPU 模式时如何从 Google Colaboratory 保存 Tensorflow 检查点文件?
- c# - C# FTP 上传卡在特定文件上
- amazon-sns - 使用带有 aws sns 的 lambda 为单个设备发送推送通知
- vulkan - 单个子通道的子通道依赖项。如何?
- javascript - 在 React 中测量一系列 DOM 元素的绝对位置