C++ 基于范围的for循环和std::vector.push_back()使程序崩溃 #包括 #包括 int main(){ std::vec; 对于(int i=0;i
来自: 如果新的size()大于capacity(),则所有迭代器和引用(包括结束迭代器的过去部分)都将无效。否则,只有结束迭代器的过去部分将无效 基于范围的for循环在内部使用迭代器。使用C++ 基于范围的for循环和std::vector.push_back()使程序崩溃 #包括 #包括 int main(){ std::vec; 对于(int i=0;i,c++,c++11,C++,C++11,来自: 如果新的size()大于capacity(),则所有迭代器和引用(包括结束迭代器的过去部分)都将无效。否则,只有结束迭代器的过去部分将无效 基于范围的for循环在内部使用迭代器。使用push_back可能会导致这些迭代器无效 编辑:请注意,当y==22时,您将在向量中插入第65个元素。容量很可能是64。许多实现将容量增加2倍(每次加倍).一旦调用std::vector::push_back或most非常量函数,迭代器将失效(当新大小超过向量的当前容量时,导致内存在内部重新分配) 你可以找
push_back
可能会导致这些迭代器无效
编辑:请注意,当
y==22
时,您将在向量中插入第65个元素。容量很可能是64。许多实现将容量增加2倍(每次加倍).一旦调用std::vector::push_back
或most非常量函数,迭代器将失效(当新大小超过向量的当前容量时,导致内存在内部重新分配)
你可以找到一些关于标准容器或迭代器一般如何工作的很好的参考资料。我希望这能让你开始!有一些非常量方法永远不会使迭代器失效。例如,或。@FrançoisAndrieux或std::vector::data。但在我看来,这是一个很好的经验法则。除了方法t以外的大多数非常量方法它可以直接引用数据。进行推回操作是在任何循环范围内还是嵌套循环范围内?(你的回答让我相信“任何循环范围”,但那将是一个陷阱)@用户您不能对使用基于范围的for循环迭代的向量执行任何使迭代器无效的操作。无效规则非常明确。例如,如果您确信size()
永远不会超过capacity()
(例如,使用reserve()
提前充分增加容量)。有关详细的无效规则,请参见每个方法的页面。是的,这是一个很大的陷阱!感谢您的帮助precision@user我想澄清的是,这个问题并非只有std::vector
才有的。这是许多容器都面临的问题。例如std::deque::erase
或std::无序映射::insert
可能会导致lidate迭代器。@FrançoisAndrieux:您可以查看其他相关帖子:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
for (int i = 0; i < 42; ++i) {
vec.push_back(i);
vec.push_back(-i);
}
for (int x: vec) {
for (int y: vec) {
vec.push_back(x + y);
}
}
for (int x: vec) {
std::cout << x << "\n";
}
}