簡體   English   中英

為什么在 pop_back() 操作之后它仍然打印完整的向量?

[英]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工作原理。

  • Vector 分配一些內存塊來存儲項目。
  • 這個塊的大小由容量定義,它表示在不分配新內存塊的情況下可以在向量中存儲多少項
  • capacity通常大於vector size
  • 現在,當您從向量中刪除項目時, capacity和分配的內存塊不會改變。 這是一個優化。
  • 當您從后面刪除項目時,只會調用析構函數(對於int它什么都不做)並且向量的大小會減小。
  • 您的值未清除,只是標記為超出矢量大小
  • 因此,當您使用operator[]它不會檢查您是否超出其大小。 它只返回特定加法器的值
  • 因為pop_back只是縮小了你所看重的尺寸仍然存在

請注意,如果你調用shrink_to_fitpop_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM