我回顾一个C++项目,看看有效以下内容:为了避免签名/未签名的比较,此C是否有意义?
std::vector<SomeType> objects;
//then later
int size = (int)objects.size();
for(int i = 0; i < size; ++i) {
process(objects[i]);
}
这是我看到的。 std::vector::size()
返回size_t
,可能有些尺寸与int
的尺寸无关。即使sizeof(int) == sizeof(size_t)
int
已签名且无法保存所有可能的值size_t
。所以上面的代码只能处理一个很长的向量的较低部分,并且包含一个bug。正确的方法是将size_t
用于size
变量和循环索引。
这就是说我很好奇为什么作者可能会写这个?
我唯一的猜测是,第一,他省略了(int)
演员和编译器发出类似的Visual C++ C4018警告:
warning C4018: '<' : signed/unsigned mismatch
因此笔者虽然,为了避免编译器警告的最佳方式是简单地将size_t
转换为int
,从而使编译器闭嘴。
C剧情有没有其他可能的理智原因?
Nitpick:'size()'返回实现定义的'vector :: size_type',不是必需的rily'size_t'。 – 2010-04-16 13:11:25
nitpick的Nitpick:默认分配器确实使用'size_t'作为'size_type'。是的,你可以写'vector :: size_type s = v.size();',但是当你改变'v'的分配器时,你仍然会使用错误的'size_type',并且需要找到并更改用法(但是,typedefs可以帮助)。 –
UncleBens
2010-04-16 14:12:42
只要你输入你的矢量类型,使用YourVectorTypedef :: size_type应该总是给出正确的类型。 – 2010-04-16 14:40:24