[英]why after pop_back() operation it still prints the complete vector?
我有以下主程序,它創建一個 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
工作原理。
capacity
通常大於vector
size
capacity
和分配的內存塊不會改變。 這是一個優化。int
它什么都不做)並且向量的大小會減小。operator[]
它不會檢查您是否超出其大小。 它只返回特定加法器的值pop_back
只是縮小了你所看重的尺寸仍然存在請注意,如果你調用shrink_to_fit后pop_back
有很大的機會,它將與崩潰或您將不會收到相同的值。 這仍然是未定義的行為,任何事情都可能發生。
查看代碼不好的另一種方法是使用at
which 檢查索引是否在有效范圍內。
std::vector::pop_back
函數工作得很好。 執行調用后,您嘗試打印所有 6 個值而不是 5 個。因此,您正在訪問無效內存。 在您的情況下,程序會打印出已刪除的值,但在其他情況下,它可能會打印一些垃圾值。 這就是為什么這是 UB - Undefined Behavior 。
嘗試以下操作,您將看到最后一個元素不在std::vector
:
for (int i = 0; i < myVector.size(); i++) {
std::cout << myVector[i];
}
或者,更好的是,使用基於范圍的 for 循環:
for (auto const i : myVector) {
std::cout << i;
}
問題在於您循環遍歷向量的方式 - 即使您刪除了最后一個元素,您仍然希望它有 6 個元素。 這是未定義的行為。
在要輸出向量內容的兩種情況下,最好使用基於范圍的 for :
for (auto i:myVector) {
cout << i;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.