#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