c++ - 为什么在 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;
}
解决方案
每个人都专注于说this is undefined behavior fix code
,但问题是它为什么有效。
要了解它为什么起作用,您必须vector
或多或少地了解它是如何起作用的。
- Vector 分配一些内存块来存储项目。
- 这个块的大小由容量定义,它表示可以在向量中存储多少项目,而无需分配新的内存块
capacity
通常size
大于vector
- 现在,当您从向量中删除项目时,
capacity
分配的内存块不会改变。这是一个优化。 - 当您从后面删除项目时,只会调用析构函数(因为
int
它什么都不做)并且向量的大小会减小。 - 您的值不会被清除,只是标记为超出矢量大小
- 所以当你使用
operator[]
它时不会检查你是否超过了它的大小。它只是返回特定加法器的值 - 因为
pop_back
您所重视的只是缩小尺寸仍然存在
请注意,如果您在很可能会发生崩溃后调用shrink_to_fit ,或者您将不会收到相同的值。pop_back
这仍然是未定义的行为,任何事情都可能发生。
另一种查看代码不好的方法是使用at
which 检查索引是否在有效范围内。
推荐阅读
- oracle - 从 Unix 假脱机法语文本的问题
- python - 在 wx 应用程序中嵌入 visvis 图形
- github-pages - 使用 Hugo 构建页面时 Git 子模块失败
- substrate - 在 Polkadot-js 中是否有创建 HD 钱包地址的方法
- python - 如何在 tensorflow 2.0 中选择“tensorflow.keras”和“tensorflow.python.keras”?
- sql - 如果另一列为空(但不是 NULL),我如何更新列?
- entity-framework - 从 .sql 文件插入 SQL 关键字
- react-native - 在 android 6 及以下版本上反应原生 Flatlist 空白区域
- python - 减少校准中的测量次数
- mime-types - 更改应用程序/xml 全局的默认服务首选项