使用auto in循环c ++

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)

这里iconst对容器元素的引用a.

否则,如果您需要索引,或者如果您不想遍历整个范围,则可以使用该类型decltype(a.size()).

for (decltype(a.size()) i = 0; i < a.size(); ++i) {
}
Run Code Online (Sandbox Code Playgroud)

  • 基于范围的循环的1个问题是索引不可用 (8认同)
  • `decltype(n)i = 0`会更短更清晰,不是吗? (5认同)

Som*_*ame 19

根据您在循环内部要执行的操作以及编译器的功能,基于范围的for循环可能是更好的解决方案.

在大多数情况下,你提出的所有解决方案都不错,只有微小的差异你的第一个解决方案实际上是更糟糕的选择,这正是你的编译器告诉你的.第二种解决方案更好,但如果您想避免直接定义类型以简化或未来的更改,您可以执行以下操作:

auto n = a.size();
for (decltype(n) i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以将in类型绑定为始终相互匹配.


小智 6

如果你使用了正确的文字,你会没事的:0U.auto看到int类型的文字,所以这是i的类型.添加U,它将看到一个unsigned int literal.否则,你想要像其他人建议的那样使用decltype,特别是因为sizeof(size_t)可能大于sizeof(int)(如果在64位长模式下运行,它在Windows,OS X等上).

  • `sizeof(0U)`总是`sizeof(size_t)`按标准? (3认同)

man*_*lio 5

为了尽可能保持常量正确,我通常会这样写:

const auto n(a.size());
for (auto i = decltype(n){0}; i < n; ++i)
{
}
Run Code Online (Sandbox Code Playgroud)

它不是很简洁,但很明显您想要一个初始化为 0n类型的变量(并且nconst)。