0

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

std::vector<node> v;

我的结构看起来像这样并保持指向向量其他元素的指针

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

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

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

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

4

3 回答 3

2

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

具体来说,

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

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

于 2013-04-06T01:10:46.770 回答
1

就我个人而言,我会使用 a std::vector<node *>(或 Boost 中无数的智能指针实现中的任何一个),因此您只需将指针重新分配给节点,而不是节点本身。

但是,如果您要走非智能指针路线,请不要忘记释放指针。

编辑:特别是如果你在你的结构中保存整个数组。您不想在每个重新分配周期都重新分配每个固定数组。我也不会使用固定数组,std::vector<node *>用于容纳邻居的内部会更好地扩展并避免这些天软件似乎困扰的大多数缓冲区溢出问题。

于 2013-04-05T14:56:51.183 回答
0

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

于 2013-04-05T15:08:18.407 回答