c++: size_type與 size_t一些概念

size_type:

 

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

  string抽象意義是字符串, size()的抽象意義是字符串的尺寸, string::size_type抽象意義是尺寸單位類型

  string::size_type它在不同的機器上,長度是可以不同的,並非固定的長度。但只要你使用了這個類型,就使得你的程序適合這個機器。與實際機器匹配。

  eg:

  string::size_type從本質上來說,是一個整型數。關鍵是由於機器的環境,它的長度有可能不同。 例如:我們在使用 string::find的函數的時候,它返回的類型就是 string::size_type類型。而當find找不到所要找的字符的時候,它返回的是 npos的值,這個值是與size_type相關的。假如,你是用 string s; int rc = s.find(.....); 然後判斷,if ( rc == string::npos ) 這樣在不同的機器平臺上表現就不一樣了。如果,你的平臺的string::size_type的長度正好和int相匹配,那麼這個判斷會僥倖正確。但換成另外的平臺,有可能 string::size_type的類型是64位長度的,那麼判斷就完全不正確了。 所以,正確的應該是: string::size_type rc = s.find(.....); 這個時候使用 if ( rc == string::npos )就回正確了。

  st.size()表示st中的字符數量,字符數量的統計是由 1 開始累計計算的,所以字符數量正好比字符串的下標索引數(由 0 開始累計計算)大 1 ,這裏的index != st.size();的效果等同於index < st.size();

 

 

size_t

 

size_t不是容器概念。
size_type是容器概念,沒有容器不能使用。
見例程:

  1. #include<iostream>  
  2. #include<vector>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.  cout<<" typeid(size_t).name() = "<<typeid(size_t).name()<<endl;  
  7.  cout<<" typeid(vector<int>::size_type).name() = "<<typeid(vector<int>::size_type).name()<<endl;  
  8.   
  9.  return 0;  
  10. }   

 

from:http://blog.sina.com.cn/s/blog_5ff6e6ed0100da4j.html

 

先是看到了在看標準庫string時size_type,後來在學習標準庫bitset的時候有碰到了size_t,暈啊

先說說是在什麼樣的機緣巧合下與size_type相遇的吧,O(∩_∩)O

標準庫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_type沒有多大區別

其實size_t和size_type類似,size_t 類型定義在cstddef頭文件中,該文件是C標準庫的頭文件stddef.h的C++版本.它是一個與機器相關的unsigned類型,其大小足以保證存儲內存中對象的大小。用法如下:

bitset<32> bitvec;

size_t sz=bitvec.size();

 另外sizeof操作符的返回值的類型也爲size_t哦

 

from:網友

 

  1. class container  
  2. {  
  3. public:  
  4.     typedef size_t size_type;  
  5.     //...  
  6. };  

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