由乙個小程式引發對 size type型別的思考

2021-07-04 09:40:44 字數 1204 閱讀 6999

今天第一天看「演算法導論」,看了插入排序演算法。想用c++練習一下,恰好最近也在複習動態陣列以及vector,想分別用動態陣列和vector實現上面的功能。

首先,用動態陣列實現沒事,程式如下:

//用動態陣列實現陣列元素從小到大的排序

#includeusing namespacestd;

int main()

p[i+1]=key;

}cout<

for (int i=0; i

然後用vector實現,**如下:

//用動態陣列實現陣列元素從小到大的排序

#include #include using namespace std;

int main()

ivec[i+1]=key;

} cout<

for(vector::iterator iter=ivec.begin();iter!=ivec.end();++iter)

cout<

cout<

那麼問題來了,最開始我輸入的是1,2,3

輸出沒問題,接下來輸入3,2,1問題就來了,出現以下報錯:

也就是說,vector下標溢位了,我想上面兩個程式,核心都一樣,為什麼第二個就不行了呢?

於是開始調程式,發現當斷點設在while迴圈後的大括號時,i的值竟然是4294967295,明白了,是i有問題。由於我設的i是size_type型別,這種型別跟int型別類似,但它是無符號的(也就是unsigned int 型別),所以當首次執行while迴圈時,i=0;while迴圈體內,i=i-1;語句使得i為負值了,但因為我設的i是無符號的,所以i溢位了。分析了原因之後,我用int型別的i代替size_type的i(也就是用紅色語句代替它上面那條語句),結果執行正常。

總結:c++中的size_type型別其實就是unsigned int 型別,但單獨設為size_type型別,只是為了更好的相容不同的作業系統而已。所以我們用int 型別來求vector下標時也是正確的。

乙個小程式引發的思考

既然是乙個小程式引發的思考,那麼我們就先看看這個小程式,看看他有何神奇之處 i s.val,i mymethod s,i console.writeline s.val i s.val,i console.read static void mymethod myclass f1,int f2 cla...

乙個由copyBean引發的血案

一次開發中使用輪子bean互轉突然發生了問題 new setdlevel 1 dto dto new dto dto beancopyutils.copybean dto.class system.out.println dto.getdlevel 列印出輸出結果 輸出結果卻變成null,怎麼肥事呢...

由乙個MFC程式引發的對程式設計嚴謹性的思考

手上有乙個基於mfc的桌面應用程式,其主要功能是 通過串列埠接收資料,經簡單處理後在其頁面上進行顯示。這個應用程式已經在某台硬體效能稍好的主機上多次執行,並未發現任何異常現象。然而,在一次系統聯試中,發生了乙個近乎無解的問題 這個應用程式在另一台效能較差的主機上竟然出現了執行即崩潰的現象。專案進度緊...