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