類型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