[英]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.