C++ c++;使用.push_back或.resize()避免向量重新分配

C++ c++;使用.push_back或.resize()避免向量重新分配,c++,performance,memory-management,stl,C++,Performance,Memory Management,Stl,我有一个关于vector的问题,特别是选项.push_back()和.resize()。 使用此选项时,当当前向量容量超出范围时,c++(STL)将始终重新分配每个元素。这对我来说是个问题,因为我有一个结构对象的向量 std::vector<node> v; std::vector v; 我的结构看起来像这样,并保持指向向量其他元素的指针 struct node { std::array<node*, nrOfNeigh> neighb; node*

我有一个关于vector的问题,特别是选项.push_back()和.resize()。 使用此选项时,当当前向量容量超出范围时,c++(STL)将始终重新分配每个元素。这对我来说是个问题,因为我有一个结构对象的向量

std::vector<node> v;
std::vector v;
我的结构看起来像这样,并保持指向向量其他元素的指针

struct node
{
    std::array<node*, nrOfNeigh> neighb;
    node* parentNode; 
    double density;
    ...
}
struct节点
{
std::数组neighb;
节点*父节点;
双密度;
...
}
因为我的结构确实有指向向量其他元素的指针,所以总是在使用.push_back()时,此依赖项将不再有效

你们有没有办法避免这种情况

我并不期望有办法强迫std::vector不重新分配。
我已经尝试使用.reserve(),因此尽可能多地保留。这是可能的,但从内存管理的角度来看并不好。

我个人会使用
std::vector
(或Boost中无数智能指针实现中的任何一个),因此您只会重新分配指向节点的指针,而不是节点本身

但是,如果您使用非智能指针路径,请不要忘记释放指针


编辑:尤其是在结构中保存整个数组时。您不希望在每个重新分配周期中重新分配每个固定阵列。我也不会使用固定数组,一个内部的
std::vector
来容纳邻居,这样可以更好地扩展并避免大多数缓冲区溢出问题,而现在软件似乎饱受困扰。

我个人会使用
std::vector
(或者Boost中无数的智能指针实现中的任何一个),因此,只需重新分配指向节点的指针,而不是节点本身

但是,如果您使用非智能指针路径,请不要忘记释放指针


编辑:尤其是在结构中保存整个数组时。您不希望在每个重新分配周期中重新分配每个固定阵列。我也不会使用固定数组,一个内部
std::vector
来容纳邻居可以更好地扩展并避免大多数缓冲区溢出问题,现在软件似乎饱受困扰。

好吧,你可以使用
.reserve()
vector的功能在使用vector之前分配您认为可能需要的内存,从而可能避免重新分配。在某些情况下,它还可以加速向量推送。请参见

您可以使用
向量
.reserve()
功能在使用向量之前分配您认为可能需要的内存,从而可能避免重新分配。在某些情况下,它还可以加速向量推送。请参见

假设结构中的node*字段仅指向向量中的其他“node”对象,则可以将node*替换为向量中的整数索引

具体来说,

struct node
{
    std::array<size_t, nrOfNeigh> neighb;
    size_t parentNodeId;
    double density;
    ...
}
struct节点
{
std::数组neighb;
大小\u t parentNodeId;
双密度;
...
}

现在,当您使用push_back()而不是存储&v.back()时,您将存储“v.size()-1”。

假设结构中的node*字段仅指向向量中的其他“node”对象,您可以使用向量中的整数索引替换node*

具体来说,

struct node
{
    std::array<size_t, nrOfNeigh> neighb;
    size_t parentNodeId;
    double density;
    ...
}
struct节点
{
std::数组neighb;
大小\u t parentNodeId;
双密度;
...
}

现在,当您使用push_back()而不是存储&v.back()时,您存储的是'v.size()-1'。

您必须使用
std::vector
?那么,当您调用
push_back
时,它还应该做什么?您可以通过
reserve()
函数为向量保留最大的位置。可以提供向量的最大容量为什么需要指向数组中某个元素的指针?为什么不维护索引?@Sambo您还没有回答“为什么需要指针而不是索引”的问题。如果你使用一个索引,你可以在需要的时候得到指针,即使向量被重新分配,索引也不会出错。这似乎是你问题的明显答案。你必须使用
std::vector
吗?那么,当你调用
push_back
时,它还应该做什么呢?你可以通过
reserve()
函数为向量保留最大的位置。可以提供向量的最大容量为什么需要指向数组中某个元素的指针?为什么不维护索引?@Sambo您还没有回答“为什么需要指针而不是索引”的问题。如果你使用一个索引,你可以在需要的时候得到指针,即使向量被重新分配,索引也不会出错。这似乎是你问题的明显答案。我也尝试过这个,但这意味着我必须动态分配每个元素(最多20.000.000和更多),这非常缓慢。我不同意你的评估。我也尝试过这个,但这意味着我必须动态分配每个元素(最多20.000.000和更多)我不同意你的评价,我试过这个。手动定义最大值工作正常。我可以定义大约2.000.000个元素,但当使用.max_size()成员函数时,我实际上应该能够定义6.945.456个元素。我尝试了这个。手动定义最大值工作正常。我可以定义大约2.000.000个元素,但在使用.max_size()成员函数时,我实际上应该能够定义6.945.456个元素。