C++ C++;11自动尺寸和U型
给出了C++ C++;11自动尺寸和U型,c++,c++11,auto,C++,C++11,Auto,给出了auto的以下用法: std::vector<int> v; for (auto i = 0; i < v.size(); ++i) { ... } std::vector v; 用于(自动i=0;i C++是理想的推导 i>代码> AS代码> STD::vector:sisiz类型< /C> >,但是如果只查看 I/C> >的初始化器,它将看到一个整数。在这种情况下,i的推断类型是什么?这是否适合使用auto?为什么不解决迭代器的问题?然后问题就消失了: std
auto
的以下用法:
std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
...
}
std::vector v;
用于(自动i=0;i
< > C++是理想的推导<代码> i>代码> AS代码> STD::vector:sisiz类型< /C> >,但是如果只查看<代码> I/C> >的初始化器,它将看到一个整数。在这种情况下,
i
的推断类型是什么?这是否适合使用auto
?为什么不解决迭代器的问题?然后问题就消失了:
std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
...
}
std::vector v;
对于(自动i=v.begin();i!=v.end();++i){
...
}
如果您想使用索引进行迭代,我可能只需要显式地说明类型:您知道它是什么<代码>自动主要用于未知或难以键入的模板类型。
自动
仅从初始值设定项获取类型。不注意其他用途,至少不用于确定变量的类型。考虑到这一点,decltype
是一个选项:
for (decltype(v.size()) i = 0; i < v.size(); ++i)
或者,您可以完全避免
for
循环。使用decltype
而不是auto
来声明i
for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
// ...
}
for(decltype(v.size())i=0;i
更好的方法是,使用迭代器对向量进行迭代,如@MarkB的答案所示。对于您的问题“这是自动的适当用法吗?”的答案是否定的,原因在其他答案中解释。对于在容器内容中循环的特定情况,最好使用基于范围的For循环: 对元素的常量引用访问,
i
是const int&
:
std::vector<int> v;
for (const auto& i : v ) {
std::cout << i << "\n";
}
std::vector<int> v;
for (auto& i : v ) {
++i;
std::cout << i << "\n";
}
值访问,i
是int
:
std::vector<int> v;
for (auto i : v ) {
...
}
std::vector v;
用于(自动i:v){
...
}
等等。这也适用于C型数组。如果不知道如何使用
i
就无法判断。我从来不知道auto
用于推断适当类型的变量!是吗?@TAMER先生是的,他们在C++11中更改了它的含义。@MarkB:太好了!!现在它类似于C#中的var
,对吗?您还可以提到标准中定义新含义的部分吗?@Mr.TAMER[dcl.spec.auto],是的,它与C#的var
关键字几乎完全相同。或者更好,使用基于范围的for循环,如下面的回答所示。它应该是begin(v)和end(v)
std::vector<int> v;
for (auto i : v ) {
...
}