c ++ vector避免使用.push_back或.resize()重新分配

时间:2013-04-05 14:53:50

标签: c++ performance memory-management stl

我有一个与vector相关的问题,尤其是选项.push_back()和.resize()。 使用此选项时,当当前向量容量超出时,c ++(STL)将始终重新分配每个元素。这对我来说是一个问题,因为我确实有一个struct对象的向量。

std::vector<node> v;

我的结构看起来像这样,并保持指向矢量

的其他元素的指针
struct node
{
    std::array<node*, nrOfNeigh> neighb;
    node* parentNode; 
    double density;
    ...
}

因为我的struct确实有指向vector的其他元素的指针,所以在使用.push_back()时,这种依赖性将不再有效。

你们中有人有想法避免这种情况吗?

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

3 个答案:

答案 0 :(得分:2)

我个人会使用std::vector<node *>(或Boost中任何无数的智能指针实现),所以你只需要重新分配指向节点的指针,而不是节点本身。

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

编辑:特别是如果你在结构中保存整个数组。您不希望每次重新分配周期都重新分配每个固定数组。我也不会使用固定数组,一个内部std::vector<node *>来保持邻居可以更好地扩展,避免大多数缓冲区溢出问题软件现在似乎受到困扰。

答案 1 :(得分:1)

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

具体地,

struct node
{
    std::array<size_t, nrOfNeigh> neighb;
    size_t parentNodeId;
    double density;
    ...
}

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

答案 2 :(得分:0)

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