#include<iostream> #include<vector> using namespace std; int main() { cout<<" typeid(size_t).name() = "<<typeid(size_t).name()<<endl; cout<<" typeid(vector<int>::size_type).name() = "<<typeid(vector<int>::size_type).name()<<endl; return 0; }
使用int變量的問題是:有些機器上的int變量的表示範圍過小,甚至沒法存儲實際並不長的string對象。如在有16位int型的機器上,int類型變量最大隻能表示32767個字符的string對象。而能容納一個文件內容的string對象輕易就能超過這個數字,所以,爲了不溢出,保存一個string對象的size的最安全的方法就是使用標準庫類型string::size_type().html
一點注意:雖然是在學習標準庫string的時候巧遇了size_type類型,可是,其實vector庫也能夠定義size_type類型,在vector庫中還有一個difference_type類型,該類型用來存儲任何兩個迭代器對象間的距離,因此是signed類型的。ios
其實size_t和size_type相似,size_t 類型定義在cstddef頭文件中,該文件是C標準庫的頭文件stddef.h的C++版本.它是一個與機器相關的unsigned類型,其大小足以保證存儲內存中對象的大小。用法以下:c++
bitset<32> bitvec;程序員
size_t sz=bitvec.size();面試
另外sizeof操做符的返回值的類型也爲size_t哦數組
標準庫vector安全
對我來講其實這一部分的知識吧,都應該很是熟悉了(主要是仍是由於下功夫看了兩遍STL源碼,加上平時都是比較喜歡用STL的),因此這裏就記錄一些比較細節的東西。函數
vector初始化賦值操做(C++11新增):容器類的主要賦值仍是那麼幾類,網上都是有的(一個套路),此次在樹上無心看到C++11新增了一種相似數組的賦值方式。
vector<int> res = {"1", "2", ...}
和數組相似的賦值方式也是可行的學習
size_t cnt = 0; for (auto &row : is) for (auto &col : row){ col = cnt; ++cnt; }
這個例子是用auto進行遍歷的二維數組,is是一個二維的,row表示的是is中每一行的一維數組,col表示的是每一個一維數組的元素。這裏最主要的是每一個auto變量都是引用的形式,這個主要的目的是放置數組直接變成指針了(隱式轉換) eg: int a[10] = {0}; int *pt = a; 這樣會發生數組變成指針的隱式轉換。spa