size_type類型與size_t的異同

1.什麼是size_type?

size_type 如同 int 、float等 一樣也是一種數據類型,不同之處在於size_type會適應機器,不同的機器size_type會有不同的長度;只要你使用了這個類型,就使得你的程序適合這個機器。與實際機器匹配

size_type是由string類型 和 vector類型 定義的 類型,用以保存任意string對象或vector對象的長度,標準庫類型將size_type定義爲unsigned類型

vector<int> v;
v.push_back(0);
v.push_back(0);
v.push_back(0);
v.push_back(0);
int i = v.size();

這樣的代碼在C++編譯器編譯時,會出現編譯警告,這是因爲vector::size()返回值類型是size_type的無符號整數,但是 int類型是有符號整數, = 號兩邊的類型並不匹配,所以會拋出警告

同時string::find()函數在查找字符串中的某一個字符時的返回值也是 size_type類型的,用size_type類型無論string對象多大,也不用擔心越界的問題,同時 如果 在字符串中沒有找到目標字符,則 find()會返回string::npos,它是與size_type類型相匹配的
所以如果我們定義

int pos = string.find('c',0);
if(pos == string::npos) 
{
	cout << "沒有找到!!"<<endl;
}

//來判斷是否找到,那麼因爲pos是int類型,而 string::npos是size_type類型,兩者可能就會完全不同,程序出錯

我們可以這樣定義:

string::sizetype pos = string.find('c',0);
if(pos == string::npos) 
{
	cout << "沒有找到!!"<<endl;
}

而且,如果使用int類型變量來保存string對象的長度,那麼可能會出現問題:
有些機器上的int變量的表示範圍太小,甚至無法存儲實際並不長的string對象。如在有16位int型的機器上,int類型變量最大隻能表示32767個字符的string對象。而能容納一個文件內容的string對象輕易就能超過這個數字,因此,爲了避免溢出,保存一個string對象的size的最安全的方法就是使用標準庫類型string::size_type().

2.什麼是size_t?

size_t 類型定義在cstddef頭文件中,該文件是C標準庫的頭文件stddef.h的C++版。
它是一個與機器相關的unsigned類型,其大小足以保證存儲內存中對象的大小。
例如:我們常用的sizeof()操作的返回值就是 size_t類型的
例如:在用下標訪問元素時,vector使用vector::size_type作爲下標類型,而數組下標的正確類型則是size_t。
vector使用的下標實際也是size_t,源碼是typedef size_t size_type。
因爲size_t類型的數據其實是保存了一個整數,所以它也可以做加減乘除,也可以轉化爲int並賦值給int類型的變量。

爲什麼要有size_t類型?
在C++中,設計 size_t 就是爲了適應多個平臺的 。size_t的引入增強了程序在不同平臺上的可移植性。size_t是針對系統定製的一種數據類型,一般是整型,因爲C/C++標準只定義一最低的位數,而不是必需的固定位數。而且在內存裏,對數的高位對齊存儲還是低位對齊存儲各系統都不一樣。爲了提高代碼的可移植性,就有必要定義這樣的數據類型。一般這種類型都會定義到它具體佔幾位內存等。
例如:在32位系統中size_t是4字節的,而在64位系統中,size_t是8字節的,這樣利用該類型可以增強程序的可移植性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章