2012-03-27 88 views
8

鉴于auto以下用法:C++ 11的汽车和SIZE_TYPE

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

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

+0

不知道你用'i'做了什么,这是不可能告诉的。 – 2012-03-27 23:11:11

+0

我从来不知道'auto'是用来推导一个变量的适当类型!可以? – 2012-03-27 23:11:46

+3

@ Mr.TAMER是的,他们改变了C++ 11的含义。 – 2012-03-27 23:13:23

回答

20

使用decltype而不是auto来声明i

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

更妙的是,使用迭代器遍历向量@ MarkB的答案节目。

+3

甚至更​​好,使用基于范围的循环,如下面的答案。 – juanchopanza 2012-03-28 09:45:59

13

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

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

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

+1

它应该是开始(v)和结束(v) – Klaim 2012-03-28 13:27:10

3

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

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

,或者您可能能够改写循环往回走:

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

或者,你可能能够避免for完全循环。

7

您的问题的答案“这是适当的使用自动?”不是因为其他答案中解释的原因。用于通过容器的内容物循环的特定情况下,你是基于for循环与一系列最可能更好:

const引用访问单元,iconst int&

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

非const引用访问,iint&

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

值访问,iint

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

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