迭代std :: vector(没有迭代器)时使用哪种类型?

Dan*_*vil 5 c++

也许这个问题很简单,但第二次考虑它我想知道如何以正确的方式做到以下几点:

std::vector<K> v = ...;
for(T i=0; i<v.size(); ++i) {
  const K& t = v[i];
  // use t *and i*
}
Run Code Online (Sandbox Code Playgroud)

应该T是什么类型的?int,unsigned int,int32_t,size_t(这将是的类型v.size())或任何其他建议?请尝试考虑可移植性,错误倾向和性能,并在您的答案中保持客观.

编辑:我没有选择迭代器,因为它也想明确使用索引号.

Gre*_*ill 6

类型i应该与返回值相同size(),即std::vector<K>::size_type.但是,在实践中,size_t会做得很好.如果使用有符号整数类型,那么编译器可能会在小于比较中警告有符号/无符号不匹配.

通常你会为此使用迭代器:

std::vector<K> v = ...;
for (std::vector<K>::iterator i = v.begin(); i != v.end(); ++i) {
  const K& t = *i;
  // use t
}
Run Code Online (Sandbox Code Playgroud)

或者,在C++ 0x中:

std::vector<K> v = ...;
for (auto i = v.begin(); i != v.end(); ++i) {
  const K& t = *i;
  // use t
}
Run Code Online (Sandbox Code Playgroud)

在回答您关于将迭代器使用向量索引的注释时,请考虑std::distance()向量迭代器的常量时间操作函数:

std::vector<K> v = ...;
for (auto i = v.begin(); i != v.end(); ++i) {
  const K& t = *i;
  size_t index = std::distance(v.begin(), i);
  // use t and index
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,在C++ 0x中:`for(auto i:v){..}`(N2930):-) (2认同)