鉴于auto
以下用法:C++ 11的汽车和SIZE_TYPE
std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
...
}
这将是理想的C++来推断i
为std::vector<int>::size_type
,但如果只着眼于初始化为i
,它会看到一个整数。在这种情况下,推导出的i
的类型是什么?这是auto
的适当用法吗?
鉴于auto
以下用法:C++ 11的汽车和SIZE_TYPE
std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
...
}
这将是理想的C++来推断i
为std::vector<int>::size_type
,但如果只着眼于初始化为i
,它会看到一个整数。在这种情况下,推导出的i
的类型是什么?这是auto
的适当用法吗?
使用decltype
而不是auto
来声明i
。
for(decltype(v.size()) i = 0; i < v.size(); ++i) {
// ...
}
更妙的是,使用迭代器遍历向量@ MarkB的答案节目。
甚至更好,使用基于范围的循环,如下面的答案。 – juanchopanza 2012-03-28 09:45:59
为什么不用迭代器解决你的问题?然后问题消失:
std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
...
}
如果你想使用索引进行迭代,我可能会明确地说明这个类型:你知道它是什么。我相信auto
主要用于未知或难以输入的模板类型。
它应该是开始(v)和结束(v) – Klaim 2012-03-28 13:27:10
auto
仅从初始值设定项中获取类型。没有注意其他用途,至少不用于确定变量的类型。要考虑到这一点为好,decltype
是一个选项:
for (decltype(v.size()) i = 0; i < v.size(); ++i)
,或者您可能能够改写循环往回走:
for (auto i = v.size(); i-- != 0;)
或者,你可能能够避免for
完全循环。
您的问题的答案“这是适当的使用自动?”不是因为其他答案中解释的原因。用于通过容器的内容物循环的特定情况下,你是基于for循环与一系列最可能更好:
const引用访问单元,i
是const int&
:
std::vector<int> v;
for (const auto& i : v) {
std::cout << i << "\n";
}
非const引用访问,i
是int&
:
std::vector<int> v;
for (auto& i : v) {
++i;
std::cout << i << "\n";
}
值访问,i
是int
:
std::vector<int> v;
for (auto i : v) {
...
}
等等。这也适用于C风格的数组。
不知道你用'i'做了什么,这是不可能告诉的。 – 2012-03-27 23:11:11
我从来不知道'auto'是用来推导一个变量的适当类型!可以? – 2012-03-27 23:11:46
@ Mr.TAMER是的,他们改变了C++ 11的含义。 – 2012-03-27 23:13:23