use*_*422 34 c++ loops auto c++11
我收到以下代码的警告签名/未签名不匹配:
auto n = a.size();
for (auto i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
问题是通过为i
它分配0 int
而不是size_t
.那么更好的是:
size_t n = a.size();
for (size_t i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
或这个:
auto n = a.size();
for (size_t i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
或者你有更好的解决方案?我更喜欢第一个,因为它更加一致,它只是使用size_t
而不是两个size_t
并且auto
用于相同的目的.
jua*_*nza 45
基于范围的循环可以是更清洁的解决方案:
for (const auto& i : a)
{
}
Run Code Online (Sandbox Code Playgroud)
这里i
是const
对容器元素的引用a
.
否则,如果您需要索引,或者如果您不想遍历整个范围,则可以使用该类型decltype(a.size())
.
for (decltype(a.size()) i = 0; i < a.size(); ++i) {
}
Run Code Online (Sandbox Code Playgroud)
Som*_*ame 19
根据您在循环内部要执行的操作以及编译器的功能,基于范围的for循环可能是更好的解决方案.
在大多数情况下,你提出的所有解决方案都不错,只有微小的差异你的第一个解决方案实际上是更糟糕的选择,这正是你的编译器告诉你的.第二种解决方案更好,但如果您想避免直接定义类型以简化或未来的更改,您可以执行以下操作:
auto n = a.size();
for (decltype(n) i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以将i
和n
类型绑定为始终相互匹配.
小智 6
如果你使用了正确的文字,你会没事的:0U.auto看到int类型的文字,所以这是i的类型.添加U,它将看到一个unsigned int literal.否则,你想要像其他人建议的那样使用decltype,特别是因为sizeof(size_t)可能大于sizeof(int)(如果在64位长模式下运行,它在Windows,OS X等上).
为了尽可能保持常量正确,我通常会这样写:
const auto n(a.size());
for (auto i = decltype(n){0}; i < n; ++i)
{
}
Run Code Online (Sandbox Code Playgroud)
它不是很简洁,但很明显您想要一个初始化为 0n
类型的变量(并且n
是const
)。
归档时间: |
|
查看次数: |
15987 次 |
最近记录: |