2013-03-02 148 views
9

我試圖使用負向索引來索引vector。所述vector::at()成員函數檢查指定索引是否是向量的邊界內,並且如果這種情況不會發生,一個out_of_range則拋出異常。索引負向索引的std ::向量

vector<float> array; // sample vector 
array.push_back(0.123); 
array.push_back(1.234); 
array.push_back(2.345); 
array.push_back(3.456); 
array.push_back(4.567); 

int index = -1; 
float f = array.at(index); 
cout << f << endl; 

vector::at()成員函數的簽名要求指定的參數是vector<T>::size_type類型,並且該類型是unsigned int爲矢量,所以編譯器應執行從int的隱式轉換(該index變量的類型)到unsigned int。由於在上例中index的值爲-1,隱式轉換的index4294967295(即unsigned int類型的最大值):該值傳遞給vector::at()成員函數,該成員函數拋出out_of_range異常。

換句話說,沒有引發這種異常,因爲vector::at()成員函數看到該index小於零,而是由於隱式轉換indexvector的當前大小越大。這是一個正確的解釋嗎?

+0

是的,基本上。 – Dave 2013-03-02 14:35:40

+0

是的,這是正確的解釋。 – syam 2013-03-02 14:35:43

回答

8

是的,這是一個正確的解釋。 (除了at需要vector::size_type,通常是std::size_t,這是一些未指定的無符號整數類型(通常是系統中指針的位寬)。您的系統上允許使用unsigned int,但不是由標準強制; 32位unsigned int與64位size_t共同地)

順便說一句,小心無符號到符號轉換:標準不要求它是一個往返持續人士簽署> unsigned->簽訂了負值,和一些編譯器積極以意想不到的方式進行優化。

+0

這是什麼意思_標準並不要求它是負值的倒數_? – enzom83 2013-03-02 14:58:48

+4

'(int)(unsigned)-1 == -1'不一定是真的。 – Yakk 2013-03-02 17:09:45

+0

「某些編譯器會以意想不到的方式進行積極優化」 - 此轉換是*實現定義的*因此不應該有任何優化意外 – 2016-05-06 13:47:34