首页 > 解决方案 > 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 个粒子保留内存!

这怎么可能?

标签: c++c++11memoryvector

解决方案


这是未定义的行为。当你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。


推荐阅读