繁体   English   中英

C ++ 11 auto和size_type

[英]C++11 auto and size_type

鉴于以下auto用法:

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的答案所示。

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

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

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

您的问题的答案“这是否适用于汽车?” 不是出于其他答案中解释的原因。 对于循环容器内容的特定情况,最好使用基于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风格的数组。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM