参考:
https://www.cnblogs.com/litifeng/p/7464307.html
http://www.it1352.com/454944.html
关于size_t
问题1:为啥不用int而是size_t这么古怪的类型,搞出好多类型不匹配的警告?
答:一个共识是:int类型一般小于等于数据线的宽度,而size_t类型一般为大于等于地址线宽度。而地址线宽度常常是大于数据线宽度的。
在数据只有8位的年代,地址率先进入10位,12位,在数据16位的年代,地址也已经进入了20位,24位。目前的int普遍是32位,而地址线宽度在主流平台中都是64位。
size_t为什么存在?因为无论int还是unsigned都很可能小于地址线宽度需要的大小,所以必须有个size_t。
问题2:为什么size_t后面要什么有个_t?
答:_t的意思就是type。关于为什么要加_t。一个类型后面加了_t说明了这是一个POSIX或GNU保留类型,防止命名空间污染(namespace pollution)。
不然标准库里新加了什么类型说不定就和用户已经定义的类型重名了。所以POSIX规定自己扩展的类型都加_t,这样只要用户定义类型的时候不加_t就不会冲突。
为什么要使用size_t?
需要在循环条件中与size_t 本身进行比较。
size_t 是任何 sizeof 表达式的类型,并且保证能够表达任何对象的最大大小包括任何数组。通过扩展它也保证足够大的任何数组索引,因此它是一个自然类型的循环通过数组的索引。
如果你只是向上计数到一个数字,那么可能更自然的是使用保存该数字的变量类型或 int 或 unsigned int (如果足够大),因为这些应该是机器的自然大小。
例子
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int num=0;
if(nums.size() == 1){
return 1;
}
for(size_t i=0;i<nums.size();++i){
int a;
a = nums[nums.size()-1];
nums.pop_back();
if(a != nums[0]){
nums.insert(nums.begin(),a);
num++;
}
else{
if(i == 0){
num = 1;
}
nums.insert(nums.begin()+i,a);
}
}
return num;
}
};