【发布时间】:2010-09-29 09:21:23
【问题描述】:
在 C++ 中迭代向量的正确方法是什么?
考虑这两个代码片段,这个工作正常:
for (unsigned i=0; i < polygon.size(); i++) {
sum += polygon[i];
}
还有这个:
for (int i=0; i < polygon.size(); i++) {
sum += polygon[i];
}
生成warning: comparison between signed and unsigned integer expressions。
我是 C++ 领域的新手,所以 unsigned 变量对我来说有点吓人,我知道 unsigned 变量如果使用不当会很危险,所以 - 这是正确的吗?
【问题讨论】:
-
无符号是正确的,因为 polygon.size() 是无符号类型。无符号表示始终为正或 0。这就是它的全部含义。因此,如果变量的使用始终仅用于计数,那么 unsigned 是正确的选择。
-
@AdamBruss
.size()不是unsigned又名unsigned int类型。它的类型为std::size_t。 -
@underscore_d size_t 是 unsigned 的别名。
-
@AdamBruss No.
std::size_t是一个 _implementation-defined typedef。见标准。std::size_t在您当前的实现中可能等同于unsigned,但这不相关。假装它是可能导致不可移植的代码和未定义的行为。 -
@underscore_d 我说无符号等于 size_t 是错误的。正如您所指出的,size_t 在 64 位构建下是 8 个字节。在 microsoft visual c++ 中也是如此。但是,如果 size_t 在两个编译器之间实际上有所不同,正如您所推断的那样,您只需使用 size_t 就会拥有不可移植的代码。