繁体   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