Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用自动循环c++;_C++_Loops_C++11_Auto - Fatal编程技术网

C++ 使用自动循环c++;

C++ 使用自动循环c++;,c++,loops,c++11,auto,C++,Loops,C++11,Auto,对于以下代码,我收到警告:有符号/无符号不匹配: auto n = a.size(); for (auto i = 0; i < n; i++) { } 或者这个: auto n = a.size(); for (size_t i = 0; i < n; i++) { } auto n=a.size(); 对于(大小i=0;i

对于以下代码,我收到警告:有符号/无符号不匹配:

auto n = a.size();
for (auto i = 0; i < n; i++) {
}
或者这个:

auto n = a.size();
for (size_t i = 0; i < n; i++) {
}
auto n=a.size();
对于(大小i=0;i
或者你有更好的解决办法?我更喜欢第一个,因为 它更加一致,只使用
size\u t
而不是
size\u t
auto

出于同样的目的。

基于范围的环路可能是一种更清洁的解决方案:

for (const auto& i : a)
{

}
这里,
i
是对容器
a
元素的
const
引用

否则,如果需要索引,或者不想在整个范围内循环,可以使用
decltype(a.size())
获取类型

for(decltype(a.size())i=0;i
根据您希望在循环中执行的操作以及编译器的功能,基于范围的for循环可能是更好的解决方案

您提出的所有解决方案在大多数情况下都不错,只是有一些细微的差别 您的第一个解决方案实际上是更糟糕的选择,这正是编译器告诉您的。 第二种解决方案更好,但如果您希望避免直接定义类型以实现简单性或将来的一些更改,则可以执行以下操作:

auto n = a.size();
for (decltype(n) i = 0; i < n; i++) {
}
for (auto i = 0u; i < a.size() - k; ++i) ...
auto n=a.size();
对于(decltype(n)i=0;i

通过这种方式,您可以绑定
i
n
类型,使它们始终相互匹配。

如果使用正确的文本,则可以:0U。auto看到int类型的文本,因此这是i的类型。加上U,它将看到一个无符号int文本。否则,您可能希望像其他人建议的那样使用decltype,特别是因为sizeof(size_t)可能大于sizeof(int)(如果在64位长模式下运行,它在Windows、OS X等上)

如果您需要访问索引以及实际元素,那么…可能是最干净的解决方案

更新:

这将是Richard Smith评论的一个变通方法,尽管它看起来不再那么干净了。

讨论:

auto n = a.size();
for (auto i = n-n; i<n; ++i) {
}
auto n=a.size();

对于(自动i=n-n;i尽可能保持常量正确,我通常写:

const auto n(a.size());
for (auto i = decltype(n){0}; i < n; ++i)
{
}
const auto n(a.size());
对于(自动i=decltype(n){0};i

它不是很简洁,但很明显,您希望将
n
类型的变量初始化为0(并且
n
const

for(auto i: a)
{
}

如果出现以下表达式,则使用无符号类型会造成问题:

auto n = a.size();
for (decltype(n) i = 0; i < n; i++) {
}
for (auto i = 0u; i < a.size() - k; ++i) ...
否则,如果有符号整数类型的操作数类型可以表示无符号整数类型的操作数类型的所有值,则无符号整数类型的操作数应转换为有符号整数类型的操作数类型


基于范围的循环的一个问题是索引不可用啊,这是一个大问题,实际上,我不想单独管理索引。
decltype(n)I=0
会更短更清晰,不是吗?我不知道,但我正在向上投票-还包括4个蹩脚的向下投票:)@JDiMatteo我同意
detlype
不是很清楚。不幸的是,
size\u t
不能保证是正确的类型,否则容器就不需要定义
size\u类型。因此,如果我想确保使用正确的类型,我会在泛型代码中使用它。但到目前为止,我不记得我必须这么做……是不是
sizeof(0U)
总是
sizeof(size\u t)
符合标准?@flex:Post-edited反映了这一点,并鼓励接受另一个答案。-1。正如柔性版所说,这个答案的前半部分是错误的。第二部分基本上是“照其他答案说的做”。如果你想“鼓励接受另一个答案”,你可以删除这个。刚刚了解了
自动i=0U
,以及使用时的注意事项@ChronoKitsune和@Flexo表明,对于OP.Cleaner,它是一个有效但不是最佳的解决方案,比普通代码中的
decltype(a.size())i=0
。这是不正确的:在声明多个变量的
auto
声明中,
auto
是为每个变量独立推导的,如果推导的类型不相同,则代码的格式不正确。那么
auto i=0u
如何?如果循环中需要索引,则使用int如何?使用无符号索引可能会很快变得令人讨厌。例如,当
i
n
未签名时,
i
是错误的。
for(auto i: a)
{
}
for (auto i = 0u; i < a.size() - k; ++i) ...
for (auto i = 0; i < static_cast<int>(a.size()); ++i) ...
for (auto i = 0ll; i < a.size(); ++i) ...