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