gpt4 book ai didi

c++ - 为什么在 pop_back() 操作之后它仍然打印完整的 vector ?

转载 作者:行者123 更新时间:2023-12-01 15:04:57 26 4
gpt4 key购买 nike

我有以下创建 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;
}

最佳答案

每个人都专注于说这是未定义的行为修复代码,但问题是它为什么有效。

要了解其工作原理,您必须或多或少了解 vector 的工作原理。

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

请注意,如果您调用 shrink_to_fitpop_back 之后,它很有可能会崩溃,否则您将不会收到相同的值。这仍然是未定义的行为,任何事情都有可能发生。

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

关于c++ - 为什么在 pop_back() 操作之后它仍然打印完整的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60413242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com