C++ 11 auto和size_type

Kai*_*Kai 8 c++ auto c++11

鉴于以下用法auto:

std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

这将是理想的C++推断istd::vector<int>::size_type,但如果只着眼于初始值设定i,它会看到一个整数.i在这种情况下推导出的类型是什么?这是适当的用法auto吗?

Pra*_*ian 20

使用decltype而不是auto声明i.

for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

更好的是,使用迭代器迭代向量,如@MarkB的答案所示.

  • 或者甚至更好,使用基于范围的for循环,如下面的答案. (3认同)

Mar*_*k B 13

为什么不用迭代器解决你的问题?然后问题就消失了:

std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

如果你想使用索引进行迭代,我可能只是明确地说明了这个类型:你知道它是什么.auto主要用于我认为的未知或难以输入的模板类型.


jua*_*nza 7

您的问题的答案"这是否适用于汽车?" 不是出于其他答案中解释的原因.对于循环容器内容的特定情况,最好使用基于for循环的范围:

const引用对元素的访问,iconst int&:

std::vector<int> v;
for (const auto& i :  v ) {
   std::cout << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)

非const引用访问,iint&:

std::vector<int> v;
for (auto& i :  v ) {
   ++i;
   std::cout << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)

价值访问,iint:

std::vector<int> v;
for (auto i :  v ) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

等等.这也适用于C风格的数组.