11

鉴于以下用法auto

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

对于 C++ 来说,推断i为是理想的std::vector<int>::size_type,但如果它只查看 的初始化器i,它会看到一个整数。i在这种情况下,推断的类型是什么?这是适当的用法auto吗?

4

4 回答 4

22

使用decltype而不是auto声明i.

for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
  // ...
}

更好的是,使用迭代器来迭代向量,如@MarkB 的回答所示。

于 2012-03-27T23:18:02.447 回答
13

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

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

如果您想使用索引进行迭代,我可能会明确说明类型:您知道它是什么。auto我认为主要用于未知或难以键入的模板类型。

于 2012-03-27T23:15:06.697 回答
7

您的问题“汽车的这种用法合适吗?”的答案 不是因为其他答案中解释的原因。对于循环遍历容器内容的特殊情况,您最好使用基于范围的 for 循环:

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

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

非常量引用访问,iint&

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

值访问,iint

std::vector<int> v;
for (auto i :  v ) {
   ...
}

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

于 2012-03-28T06:16:55.407 回答
4

auto仅从初始化程序中获取类型。没有注意其他用途,至少不用于确定变量的类型。考虑到这一点,还有decltype一个选项:

for (decltype(v.size()) i = 0; i < v.size(); ++i)

或者,您可以重写循环以倒退:

for (auto i = v.size(); i-- != 0; )

或者,您可以for完全避免循环。

于 2012-03-27T23:17:18.800 回答