在循环c++中使用auto
Using auto in loops c++
我收到以下代码的有符号/无符号不匹配警告:
auto n = a.size();
for (auto i = 0; i < n; i++) {
}
问题是,通过将0分配给i
,它变成了int
而不是size_t
。那么什么更好呢:
size_t n = a.size();
for (size_t i = 0; i < n; i++) {
}
或者这个:
auto n = a.size();
for (size_t i = 0; i < n; i++) {
}
或者你有更好的解决方案?我更喜欢第一个,因为它更加一致,它只使用size_t
,而不是同时使用size_t
和auto
出于同样的目的。
基于范围的循环可能是更清洁的解决方案:
for (const auto& i : a)
{
}
这里,i
是对容器a
的元素的const
引用。
否则,如果需要索引,或者不想在整个范围内循环,可以使用decltype(a.size())
获取类型。
for (decltype(a.size()) i = 0; i < a.size(); ++i) {
}
根据您想在循环中做什么以及编译器的功能,基于范围的for循环可能是更好的解决方案。
您提出的所有解决方案在大多数情况下都不错,只是有一些细微的差异你的第一个解决方案实际上是更糟糕的选择,这正是你的编译器告诉你的。第二种解决方案更好,但如果您想避免直接定义类型以简化操作或将来进行一些更改,可以执行以下操作:
auto n = a.size();
for (decltype(n) i = 0; i < n; i++) {
}
通过这种方式,可以将i
和n
类型绑定为始终相互匹配。
如果你使用了正确的文字,你会很好:0U。auto看到一个int类型的文字,所以这就是i的类型。加上U,它会看到一个无符号的int文字。否则,您可能会像其他人建议的那样使用decltype,特别是因为sizeof(size_t)可能大于sizeof(int)(如果在64位长模式下运行,则在Windows、OS X等上)。
为了尽可能保持常量正确,我通常会写:
const auto n(a.size());
for (auto i = decltype(n){0}; i < n; ++i)
{
}
它不是很简洁,但很明显,您想要一个初始化为n
类型的0的变量(而n
是const
)。
讨论:
auto n = a.size();
for (auto i = n-n; i<n; ++i) {
}
注意,对于小于int
的类型,子运算结果会扩展到int
(称为整数提升)。
这里有一个简单的&更清洁的解决方案使其发挥作用。
for(auto i: a)
{
}
在以下表达式的情况下,使用无符号类型会带来问题:
for (auto i = 0u; i < a.size() - k; ++i) ...
我提出两种选择。第一个(编辑选择):
for (auto i = 0; i < static_cast<int>(a.size()); ++i) ...
如果你可以使用比size_t
大的类型:
for (auto i = 0ll; i < a.size(); ++i) ...
否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型操作数的所有值,则无符号整数型操作数应转换为有符号整数型的操作数类型。[expr.arith.cov]
for ( decltype (a.size()) i = 0; i < a.size(); i++) {...}
我希望这能有所帮助。
for(auto n = a.size(), i = 0; i != n; ++i) {
}
如果您需要访问索引以及实际元素,则可能是最干净的解决方案。
更新:
for(auto n = a.size(), i = n*0; i != n; ++i) {
}
这将是Richard Smiths评论的一个变通方法,尽管它看起来不再那么干净了。
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- C++:带有 "auto" 的二维数组上的嵌套 For 循环
- 有什么理由不使用 auto& 进行C++基于范围的 for 循环?
- 在循环c++中使用auto
- 在基于嵌套范围的 for 循环中使用 auto(用于迭代)
- 在 for-each 循环中使用 'auto' 时是否需要添加'const'?
- 使用自动输入循环错误"auto must have an initializer"
- 强制auto为range for循环中的引用类型
- auto在基于范围的for循环中是可选关键字吗?
- 使用auto循环vector时使用子类成员
- 基于范围的 for 循环与 decltype(auto)