类型T通常无关紧要,只要它与矢量大小一样大。
在性能方面,应该没有任何区别。
在错误倾向/便携性方面,我建议使用符号整数,因为如果你以某种方式减去从i
值,你会得到一个大的正数,这是很难检查不是负数。但由于v.size()
是size_t
,如果使用T的一个符号整数,并v
具有≥2 (或2 )项目,该i
将有可能成为结束前无效。但是我认为,如果矢量需要大得多(特别是在64位平台上),那么还有其他更大的问题,而不是选择哪种类型的T。
从不使用int32_t
作为计数器。
(这些都是之前OP的编辑:)
但在你的情况你可能想用一个迭代器迭代来代替。
for (std::vector<K>::const_iterator cit = v.begin(); cit != v.end(); ++ cit) {
const K& t = *cit;
// ...
}
随着Boost.Foreach你可以把这个烂摊子到
BOOST_FOREACH(const K& t, v) {
// ...
}
在C++ 0x中这将成为一个built-in feature(§ [stmt.ranged]),但据我所知没有编译器支持它尚未:
for (const K& t : v) {
// ...
}
但是大多数声称支持C++ 0x的编译器应该允许auto
:
for (auto cit = v.cbegin(); cit != v.cend(); ++ cit) {
const K& t = *cit;
// ...
}
或lambda表达式:
std::for_each(v.cbegin(), v.cend(), [](const K& t) {
...
});
或者C++ 0x中:'为(自动I:V){...}'(N2930):-) – 2010-07-27 09:24:44
现在我的问题是,什么更快/更清晰/可移植性:使用整数来迭代(并将其作为索引直接使用)或使用迭代器和距离函数来计算索引? – Danvil 2010-07-27 09:30:43
@Danvil:最有可能的,没关系。两者都包含一个简单的增量和一个加法或减法。而在这两种情况下,这两种说法都不能进行同步。我期望分开增加i和迭代器的解决方案会稍微快一点,因为它可以被并行化。但是,我怀疑这种差异在实践中是可以衡量的。 – Sjoerd 2010-07-27 09:44:31