簡體   English   中英

矢量和指針

[英]Vectors and Pointers

向量和指向其元素的指針的主要問題是,無論何時調用push_back ,它們都可以在內存中重新分配,從而使指針無效。

我正在嘗試實現后綴trie,其中我將數據結構node存儲在node向量中。 我知道對於大小為n的字符串,數字n(n + 1)/ 2是trie中節點數的上限。

代碼也是如此

std::string T = "Hello StackOverflow!";
std::vector<Node> nodes;

int n = T.length();
nodes.reserve(n*(n+1)/2);

保證我創建的任何指向nodes元素的指針都不會失效? 即這會保證向量不被重新分配嗎?


編輯 :我已經實現了這一點,並在運行時不斷收到以下錯誤。

terminate called after throwing an instance of 'std::out_of_range'
what():  basic_string::at: __n (which is 0) >= this->size() (which is 0)
Aborted (core dumped)

可能導致這種情況的任何想法?

根據標准( N4140 ):

23.3.6.3載體容量
....

 void reserve(size_type n); 

....
reserve() ,如果重新分配, capacity()大於或等於reserve的參數; 並且等於capacity()的先前值。 當且僅當當前容量小於reserve()的參數時,才會發生重新分配。

23.3.6.5向量修飾符
....

 void push_back(const T& x); void push_back(T&& x); 

備注:如果新大小大於舊容量,則會導致重新分配。 如果沒有重新分配,插入點之前的所有迭代器和引用仍然有效。

如果你小心的話,你可以確定你的指針不會失效。 請參見std :: vector :: push_back 它說這是關於失效:

如果new size()大於capacity(),那么所有迭代器和引用(包括過去的迭代器)都將失效。 否則只有過去的結束迭代器無效。

只需確保不要超出容量push_back或調用可能無效的其他方法。 “Iterator invalidation”部分中提供無效的方法列表。

暫無
暫無

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

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