簡體   English   中英

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

[英]c++ vector avoid reallocation by using .push_back or .resize()

我有一個與向量有關的問題,尤其是選項.push_back()和.resize()。 使用此選項時,當當前向量容量超出時,c ++(STL)將始終重新分配每個元素。 這對我來說是個問題,因為我確實有一個struct對象向量。

std::vector<node> v;

我的結構看起來像這樣,並保持指向向量的其他元素的指針

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

因為我的結構確實具有指向向量其他元素的指針,所以始終在使用.push_back()時,此依賴項將不再有效。

你們中有人有想法避免這種情況嗎?

我不期望有一種方法可以強制std :: vector不重新分配。 我已經嘗試過使用.reserve(),因此可以保留盡可能多的內容。 這是可能的,但是從內存管理的角度來看並不理想。

假定結構中的node *字段僅指向向量中的其他“ node”對象,則可以將node *替換為向量中的整數索引。

特別,

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

現在,當您使用push_back()而不是存儲&v.back()時,您將存儲“ v.size()-1”。

我個人將使用std::vector<node *> (或Boost中無數的智能指針實現中的任何一個),因此您僅將指針重新分配給節點,而不是節點本身。

但是,如果您要走非智能指針路線,請不要忘記釋放指針。

編輯: 尤其是如果您將整個數組保存在結構中。 您不想在每個重新分配周期都去重新分配每個固定的數組。 我也不會使用固定的數組,內部std::vector<node *>來容納鄰居會更好地擴展,並且避免了如今這些軟件似乎困擾着大多數緩沖區溢出的問題。

那么你可以使用.reserve()的功能vector分配盡可能多的內存,你認為你使用向量之前 ,從而避免可能的重新分配,你可能需要。 在某些情況下,它還可以加快矢量推送。 這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM