我有一个与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(),从而尽可能保留。这是可能的,但从内存管理的角度来看并不好。
答案 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.