string::size_type型別
從邏輯上來講,size()成員函式似乎應該返回整型數值,或如2.2節「建議」中所述的無符號整數。但事實上,size操作返回的是string::size_type型別的值。我們需要對這種型別做一些解釋。
string類型別和許多其他庫型別都定義了一些夥伴型別(companion types)。這些夥伴型別使得庫型別的使用是機器無關的(machine-independent)。size_type就是這些夥伴型別中的一種。它定義為與unsigned型(unsigned int或unsigned long)具有相同的含義,而且可以保證足夠大可儲存任意string物件的長度。為了使用由string型別定義的size_type型別,程式設計師必須加上作用域操作符來說明所使用的size_type型別是由string類定義的。
任何儲存string的size操作結果的變數必須為string::size_type型別。特別重要的是,不要把size的返回值賦給乙個int變數。
雖然我們不知道string::size_type的確切型別,但可以知道它是unsigned型(2.1.1節)。對於任意一種給定的資料型別,它的unsigned型所能表示的最大正數值比對應的signed要大一倍。這個事實表明size_type儲存的string長度是int所能儲存的兩倍。
使用int變數的另乙個問題是,有些機器上int變數的表示範圍太小,甚至無法儲存實際並不長的string物件。如在有16位int型的機器上,int型別變數最大只能表示32767個字元的string物件。而能容納乙個檔案內容的string物件輕易就會超過這個數字。因此,為了避免溢位,儲存乙個string物件size的最安全的方法就是使用標準庫型別string:: size_type。
所有的查詢函式都返回乙個size_type型別,這個返回值一般都是所找到字串的位置,如果沒有找到,則返回string::npos 。有一點需要特 別注意,所有和string::npos的比較一定要用string::size_type來使用,不要直接使用int 或者unsigned int等型別。
問題起源於這樣一段**:
01 #include
02 #include
03 04 int main()
05 其實是很簡單的題目,不過要對size_t型別有乙個了解才行。
資料型別"socklen_t"和int應該具有相同的長度。否則就會破壞 bsd套接字層的填充.posix開始的時候用的是size_t, linus torvalds(他希望有更多的人,但顯然不是很多) 努力向他們解釋使用size_t是完全錯誤的,因為在64位結構中 size_t和int的長度是不一樣的,而這個引數(也就是accept函式的第三引數)的長度必須和int一致,因為這是bsd套接字介面標準.最終 posix的那幫傢伙找到了解決的辦法,那就是創造了乙個新的型別"socklen_t".linuxtorvalds說這是由於他們發現了自己的錯誤但又不好意思向大家夥兒承認,所以另外創造了乙個新的資料型別 。
size_t在c語言中就有了,size_t和ssize_t是ansi c提供的標準標頭檔案裡定義的乙個"資料型別",其實並不是新的資料型別,不是關鍵字,是通過typedef從已有資料型別定義而來。
ansi c總共提供了24個頭檔案。
裡這麼定義了
#include
using ::size_t
using::ptrdiff_t
在/usr/lib/gcc/i486-linux -gnu/4.4/include下面
裡面我找到了這麼幾句:
#ifndef __size_type__
#define __size__type__ long unsigned int
#endif
#if !(defined(__gunu__) && defined (size_t))
typedef __size_type__ size_t;
#ifdef __beos
typedef long ssize_t
沒太看明白,不過從網上找到了不錯的乙個解釋:
size_t是為了方便系統之間的移植而定義的。
在32位系統上定義為 unsigned int
在64位系統上定義為 unsigned long
更準確的說法是在32位系統上是32位無符號整型
在64位系統上是64位無符號整型
size_t一般用來表示一種計數,比如有多少東西被拷貝等。
sizeof操作符的結果型別是size_t,
該型別保證能容納實現所建立的最大物件的位元組大小。
它的意義大致是"適於計量記憶體中可容納的資料專案的個數的無符號整數型別"。
所以,它在陣列下標和記憶體管理函式之類的地方廣泛使用
ssize_t:
這個資料型別用來表示可以被執行讀寫操作的資料塊的大小。它和size_t類似,但必須是signed。
再來看下size_t與size_type的區別:
我覺得有一句話總結的很好:
size_t是全域性的,而size_type是跟容器相關的。
/c++ /4.3/bits/stl_tree.h,stl_list.h,stl_deque.h等直接這麼定義了
typedef size_t size_type
stl_mutiset.h則這麼定義的:
typedef typename _rep_type::size_type size_type;
那麼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型別的。
-1 100。
C語言 C語言組成
c語言由多個 c 檔案和 件組成 c c語言源 檔案 h c語言標頭檔案 c檔案 組成 1 標頭檔案 include include student.h 包括起來的是系統的標頭檔案 包含起來的是自己定義的檔案 2 巨集定義 define a.不帶引數的巨集 define 巨集名 替換的內容 defi...
從C語言到C 語言
c 讀作 c加加 是 c plus plus 的簡稱。顧名思義,c 是在c語言 的基礎上增加新特性。從語法上看,c語言是 c 的一部分,c語言 幾乎不用修改就能夠以 c 的方式編譯。對於c和c 的關係,有很多種說法,新人很容易認為c 是c的公升級版,c 比c要高階,c 高大上,c過時了,這種想法不一...
C語言 C語言之continue
c語言迴圈 c 語言中的continue語句有點像break語句。但它不是跳出該迴圈語句,continue是跳過本次迴圈直接開始下一次迴圈的。在for迴圈裡,continue會跳過本次迴圈,但是自增語句仍然會執行,而在while和do while語句裡嘖是跳過迴圈重新執行判斷語句 課堂作業內容為 輸...