【发布时间】:2017-01-09 21:38:16
【问题描述】:
向量和指向其元素的指针的主要问题是,只要调用push_back,它们就可以在内存中重新分配,从而导致指针无效。
我正在尝试实现一个后缀特里树,我将一个数据结构node 存储在一个节点向量中。我知道对于大小为 n 的字符串,数字 n(n+1)/2 是树中节点数的上限。
代码也是如此
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)
有什么可能导致这种情况的想法吗?
【问题讨论】:
-
查看
std::deque。push_back不会使引用/指针无效(但迭代器无效)。 en.cppreference.com/w/cpp/container/deque -
@Kevin:问题是关于
std:::vector,而不是std::deque:)。 -
@AlexD 我知道,如果他想要一个支持
push_back并且不会使引用无效的容器,我只是提到了一个替代方案。std::deque有其用途,但经常被忽略。不过,下面的答案可能适合这个问题。