C++ 访问索引0处的向量时';它是空的
为什么我仍然可以从C++ 访问索引0处的向量时';它是空的,c++,stl,stdvector,C++,Stl,Stdvector,为什么我仍然可以从vectors[0]中获取值,即使我在第一步已经pop_back() 我猜现在我的向量是空的,请调用empty() #包括 #包括 结构向量2{ int x,y; 向量2(整数x,整数y) :x(x) ,y(_y){} 向量2(常量向量2和向量) :x(向量x) ,y(向量y){ std::cout使用运算符[]访问索引0处的空向量是超出范围的,因此,这样做会使整个程序无效。编译器可以生成它想要的任何结果。任何行为都是可以接受的。 您无法对包含UB的程序进行推理。请尝试.at(
vectors[0]
中获取值,即使我在第一步已经pop_back()
我猜现在我的向量是空的,请调用empty()
#包括
#包括
结构向量2{
int x,y;
向量2(整数x,整数y)
:x(x)
,y(_y){}
向量2(常量向量2和向量)
:x(向量x)
,y(向量y){
std::cout使用运算符[]
访问索引0处的空向量是超出范围的,因此,这样做会使整个程序无效。编译器可以生成它想要的任何结果。任何行为都是可以接受的。
您无法对包含UB的程序进行推理。请尝试.at(0)
而不是[0]
。
#include <iostream>
#include <vector>
struct Vector2 {
int x, y;
Vector2(int _x, int _y)
: x(_x)
, y(_y) {}
Vector2(const Vector2& vec)
: x(vec.x)
, y(vec.y) {
std::cout << "[Copy] Vector2{" << x << "," << y << "} copied!"
<< std::endl;
}
void Print() {
std::cout << "[Print] Vector2{" << x << "," << y << "}" << std::endl;
}
};
void PrintVectors(const std::vector<Vector2>& vectors) {
std::cout << "---" << std::endl;
for (auto& vector : vectors) {
std::cout << "Vector2{" << vector.x << "," << vector.y << "}"
<< std::endl;
}
}
int main() {
std::vector<Vector2> vectors;
vectors.push_back({21, 78});
PrintVectors(vectors);
// First
vectors.pop_back();
if (vectors.empty()) {
std::cout << "Empty condition!" << std::endl;
}
vectors[0].Print(); // ---> I thought I'd get an error at this point.
vectors.insert(vectors.begin(), {vectors[0].x + 1, vectors[0].y});
PrintVectors(vectors);
// Second
vectors.pop_back();
vectors[0].Print();
vectors.insert(vectors.begin(), {vectors[0].x + 1, vectors[0].y});
PrintVectors(vectors);
// Third + no pop_back needed
vectors[0].Print();
vectors.insert(vectors.begin(), {vectors[0].x + 1, vectors[0].y});
PrintVectors(vectors);
// 4th
vectors.pop_back();
vectors[0].Print();
vectors.insert(vectors.begin(), {vectors[0].x + 1, vectors[0].y});
PrintVectors(vectors);
}