矢量和指针

时间:2017-01-09 21:38:17

标签: c++ pointers vector

向量和指向其元素的指针的主要问题是,只要调用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)

任何可能导致此问题的想法?

2 个答案:

答案 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可以使用无效的方法列表。