首页 > 解决方案 > 为什么在 pop_back() 操作之后它仍然打印完整的向量?

问题描述

我有以下主程序,它创建一个 Stack 对象,用整数填充它,然后弹出它们。代码文件很好,但 pop_back() 部分似乎不起作用,即使在 pop_back() 之后它也会打印所有值。这怎么可能?

#include<iostream>
#include<vector>
using namespace std;
int main(){

    vector<int> myVector; //initalization

    int value;
    //input in a vector using push_back
    for (int i = 0; i < 6;i++){
        cin >> value;
        myVector.push_back(value);
    }
    cout<<"Initial vector size:" << myVector.size() <<endl;

    for (int i = 0; i < 6;i++){
        cout << myVector[i];
    }
    cout << endl;
    myVector.pop_back();
    cout<<"Vector size after pop back: " << myVector.size() << endl;
    cout << endl;
    cout << "First element is: " << myVector.front() << endl;
    cout << "Last element is : " << myVector.back() << endl;
    for (int i = 0; i < 6;i++){
        cout << myVector[i];
    }
        return 0;
}

标签: c++vector

解决方案


每个人都专注于说this is undefined behavior fix code,但问题是它为什么有效。

要了解它为什么起作用,您必须vector或多或少地了解它是如何起作用的。

  • Vector 分配一些内存块来存储项目。
  • 这个块的大小由容量定义,它表示可以在向量中存储多少项目,而无需分配新的内存块
  • capacity通常size大于vector
  • 现在,当您从向量中删除项目时,capacity分配的内存块不会改变。这是一个优化。
  • 当您从后面删除项目时,只会调用析构函数(因为int它什么都不做)并且向量的大小会减小。
  • 您的值不会被清除,只是标记为超出矢量大小
  • 所以当你使用operator[]它时不会检查你是否超过了它的大小。它只是返回特定加法器的值
  • 因为pop_back您所重视的只是缩小尺寸仍然存在

请注意,如果您在很可能会发生崩溃后调用shrink_to_fit ,或者您将不会收到相同的值。pop_back这仍然是未定义的行为,任何事情都可能发生。

另一种查看代码不好的方法是使用atwhich 检查索引是否在有效范围内。


推荐阅读