size_t與size_type區別
size() 標準庫string裏面有個函數size,用來返回字符串中的字符個數,具體用法如下:
string st("The expense of spirit\n");
cout << "The size of "<<st<<"is"<<st.size()<< "characters, including the newline"<<endl;
那麽size()這個函數返回的類型到底是什麽呢?一定要記住,絕對不是整形,而是size_type類型的,所以千萬不要把size的返回值賦給一個int變量。
size_type
string類類型和許多其他庫類型都定義了一些配套類型(companion type)。通過這些配套類型,庫類型的使用就能與機器無關。size_type就是這些配套類型中的一種。size_type被定義為與unsigned型(unsigned int, unsigned long)具有相同的含義,而且可以保證足夠大能夠存儲任意string對象的長度。為而來使用由string類型定義的size_type類型。程序員必須加上作用於操作符來說明所使用的size_type類型是由string類定義的。
我們為什麽不適用int變量來保存string的size呢?
使用int變量的問題是:有些機器上的int變量的表示範圍太小,甚至無法存儲實際並不長的string對象。如在有16位int型的機器上,int類型變量最大只能表示32767個字符的string對象。而能容納一個文件內容的string對象輕易就能超過這個數字,因此,為了避免溢出,保存一個string對象的size的最安全的方法就是使用標準庫類型string::size_type().一點註意:雖然是在學習標準庫string的時候巧遇了size_type類型,但是,其實vector庫也可以定義size_type類型,在vector庫中還有一個difference_type類型,該類型用來存儲任何兩個叠代器對象間的距離,所以是signed類型的。
size_t 什麽是size_t類型呢?其實本質上和size_type沒有多大區別
其實size_t和size_type類似,size_t 類型定義在cstddef頭文件中,該文件是C標準庫的頭文件stddef.h的C++版本.
它是一個與機器相關(記住是機器相關的)的unsigned類型,其大小足以保證存儲內存中對象的大小。用法如下:
bitset<32> bitvec;
size_t sz=bitvec.size();
另外sizeof操作符的返回值的類型也為size_t
size_t與size_type區別