C++ 为什么可以';我不能像这样擦除向量的所有元素吗?
我崩溃的源代码在这里:C++ 为什么可以';我不能像这样擦除向量的所有元素吗?,c++,C++,我崩溃的源代码在这里: #include <vector> using namespace std; vector<int>::iterator iter , tempIt; int main() { vector<int> cont(3, 5); for (iter = cont.begin() ; iter != cont.end() ; ) { tempIt = iter; ++iter;
#include <vector>
using namespace std;
vector<int>::iterator iter , tempIt;
int main() {
vector<int> cont(3, 5);
for (iter = cont.begin() ; iter != cont.end() ; ) {
tempIt = iter;
++iter;
cont.erase(tempIt);
}
return 0;
}
#包括
使用名称空间std;
向量:迭代器iter,tempIt;
int main(){
向量cont(3,5);
对于(iter=cont.begin();iter!=cont.end();){
tempIt=iter;
++iter;
继续擦除(临时);
}
返回0;
}
擦除最后一个元素时,它总是失败 来自:
在擦除点或之后使迭代器和引用无效,包括end()迭代器
因此,擦除将使您的iter迭代器无效,此后您将有未定义的行为。来自:
在擦除点或之后使迭代器和引用无效,包括end()迭代器
因此,擦除将使您的
iter
迭代器无效,此后您将有未定义的行为。执行++iter
,然后擦除该迭代器,然后检查它是否等于cont.end()
end
是向量的实际端点。是否确实要这样做?“删除向量端以外位置的元素会导致容器在段删除后将所有元素重新定位到新位置。”因为这就是指定std::vector
的方式。如果您需要在中间进行擦除,您可能不需要向量
。仅供参考,编写循环体的标准方法是{iter=cont.erase(iter);}
。请注意,在这种情况下,您只需执行cont.clear()
您执行++iter
操作,然后将其擦除,然后检查它是否等于cont.end()end
是向量的实际端点。是否确实要这样做?“删除向量端以外位置的元素会导致容器在段删除后将所有元素重新定位到新位置。”因为这就是指定std::vector
的方式。如果您需要在中间进行擦除,您可能不需要向量
。仅供参考,编写循环体的标准方法是{iter=cont.erase(iter);}
。请注意,在这种情况下,您只需执行cont.clear()代码>