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);
}