向量和指向其元素的指针的主要问题是,只要调用push_back
,它们就可以在内存中重新分配,从而使指针无效。
我正在尝试实现后缀trie,其中我将数据结构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)
任何可能导致此问题的想法?
答案 0 :(得分:5)
根据标准(N4140
):
23.3.6.3载体容量
....void reserve(size_type n);
....
在reserve()
之后,capacity()
大于或等于reserve的参数if 重新分配发生;并且等于capacity()
的先前值。重新分配发生 此时,当且仅当当前容量小于reserve()
的参数时。
和
23.3.6.5向量修饰符
....void push_back(const T& x); void push_back(T&& x);
备注:如果新大小大于旧容量,则会导致重新分配。如果没有重新分配, 插入点之前的所有迭代器和引用都保持有效。
答案 1 :(得分:2)
如果你小心的话,你可以确定你的指针不会失效。见std::vector::push_back。它说这是关于失效的:
如果new size()大于capacity(),那么所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。
只需确保您没有push_back
超出容量或调用其他可能无效的方法。在“迭代器失效”一节中,here可以使用无效的方法列表。