当我运行以下代码时,我会在' find()'上得到一个段错误。调用
#include <vector>
#include <unordered_map>
struct item {
std::unordered_map<int,int> map;
};
int main(int argc, char** argv) {
std::vector<item> stack;
stack.emplace_back();
std::unordered_map<int,int>& topmap=stack.back().map;
stack.emplace_back();
auto ind=topmap.find(5);
if(ind!=topmap.end()) {
printf("Found element five in second to top item\n");
}
}
(用-std = c ++ 11编译)
但是,如果删除了第二个emplace_back()调用,则不存在段错误。
这是为什么?我使用引用变量错了吗?向堆栈添加另一个元素会使topmap无效吗?
答案 0 :(得分:3)
最可能的解释是,对emplace_back
的第二次调用导致重新分配,使topmap
无效。您可以通过查看stack.capacity()
轻松查看此内容。如果在不同呼叫之间发生变化,则会进行重新分配。
答案 1 :(得分:2)
如果您阅读例如this reference,您会看到文字
如果新的
size()
大于capacity()
,则所有迭代器和引用(包括过去的迭代器)都将失效。&#34;
在向量的末尾添加新项通常会重新分配向量中的数据并导致此行为。更具体地说,由于map
是结构内部的普通实例,因此它也将被重新分配。
答案 2 :(得分:1)
在堆栈中添加另一个元素会使topmap无效吗?
不是强制性的,但可以。这取决于调用std::vector::emplace_back()
时是否发生了重新分配。
std::vector::emplace_back documentation:
如果新的size()大于capacity()那么所有的迭代器和 引用(包括过去的结束迭代器)无效。 否则只有过去的迭代器无效。