Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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++ 汽车怎么了? vector函数(vector&arr) { 对于(自动i=arr.size()-1;i>=0;i--) 标准::cout_C++_Vector_Auto - Fatal编程技术网

C++ 汽车怎么了? vector函数(vector&arr) { 对于(自动i=arr.size()-1;i>=0;i--) 标准::cout

C++ 汽车怎么了? vector函数(vector&arr) { 对于(自动i=arr.size()-1;i>=0;i--) 标准::cout,c++,vector,auto,C++,Vector,Auto,arr.size()是一种无符号数据类型,通常是大小。i无符号时,i>=0总是true。从0的无符号变量中减去1将导致该类型可以容纳的最大数量。因此,它将永远循环 接下来会发生什么是不确定的,因为数组索引将变成一个巨大的值,arr[i]将对值>=arr.size()有未定义的行为。如果您有一个int而不是auto,它会工作,因为i--最终将使它成为-1,然后i>=0将成为false,退出循环 可以找到此翻转行为的解释: 无符号整数算术总是以2n为模执行,其中n是该特定整数中的位数。例如,对于无符

arr.size()
是一种无符号数据类型,通常是
大小
i
无符号时,
i>=0
总是
true
。从
0
的无符号变量中减去
1
将导致该类型可以容纳的最大数量。因此,它将永远循环

接下来会发生什么是不确定的,因为数组索引将变成一个巨大的值,
arr[i]
将对值
>=arr.size()有未定义的行为
。如果您有一个
int
而不是
auto
,它会工作,因为
i--
最终将使它成为
-1
,然后
i>=0
将成为
false
,退出循环

可以找到此翻转行为的解释:

无符号整数算术总是以2n为模执行,其中
n
是该特定整数中的位数。例如,对于无符号整数,将一加到
UINT_MAX
中​<代码>0​, 从中减去一​0​ 给出
UINT\u MAX


因此,对于
size\u t
,从
0
中减去
1
会得到
size\u MAX
,通常值为
18446744073709551615
,如果循环的方向相反(从MAX到0),则通常会出现以下问题:

  • 最大值为size\u t,因此
    i>=0
    始终为真
  • 或者将
    i
    更改为int,以便对有符号与无符号进行比较,这将导致编译器警告,或者将int与x64中的较大值进行比较
重新设计循环:

  • i
    使用一个新类型,在x86中为long,在x64中为long,现在当对象在x64中不超过2^63时,i>=0是好的(最有可能)
  • i==0
    时,在循环内中断
  • 更改为正常的
    i=0
    i
    方法

您的问题是由BRAZE和RAFIX07解决的,但我想补充一下,在现代C++中,最好在任何可能的情况下使用迭代器。这几乎没有什么优点,包括代码可移植性、更好的性能和更可读的代码。 您的代码可以如下所示:

vector<int> function(vector<int> &arr)
{
    for(auto i = arr.size() - 1; i >= 0; i--)
        std::cout << arr[i] << " ";

    return arr;
}

int main()
{
    vector<int> arr{1,2,3,4};
    function(arr);
}
std::vector函数(std::vector和arr)
{
对于(自动it=arr.rbegin();i!=arr.rend();++i)

std::cout ok,但我的索引不是>0将减量移动到以下条件:
(自动i=arr.size();(i-->0;)
@M.M更好?@Bob_uuuu.返回传递给函数的未更改的
std::vector
有什么意义?为什么不直接返回
void
?嗯,最好的解决方案是使用std::vector的常量反向迭代器[for(auto i=arr.crend();i!=arr.crbegin();i--])]。此外,由于您不更改arr,因此最好将其作为const ref传递。否则,我同意Jesper Juhl的观点,即您应该返回void,并使用Blaze的答案。虽然如果它是
int
,但如果向量的值大于
int\u MAX
objects@M.M没错。最好的解决方案可能是改变循环条件因此,它不必依赖于
i
成为
-1
。当然,对于OP的例子,
INT\u MAX
就足够了。谢谢,我了解问题所在。通常你需要索引。@walnut你不能用range for遍历相反方向。@vll啊,对了,抱歉。仍然是这样的措辞“在现代C++中,每当迭代时总是使用迭代器更好”在我看来奇怪,当迭代器一直在C++中使用,而现代方法则朝着范围变化。“MichaelChourdakis,是的,有时会发生,虽然在我的实践中不是经常发生的,但是无论如何,我真的错过了python <代码>枚举())
有时。幸运的是,我们很快就会有射程…@vll您可以,只需一点帮助
std::vector<int> function(std::vector<int> &arr)
{
    for(auto it = arr.rbegin(); i != arr.rend(); ++i)
        std::cout << *it << " ";

    return arr;
}
std::vector<int> function(std::vector<int> &arr)
{
    std::for_each(arr.rbegin(), arr.rend(), [](int val) {
        std::cout << val << " ";
    });

    return arr;
}
std::vector<int> function(std::vector<int> &arr)
{
    std::copy(arr.rbegin(), arr.rend(), std::ostream_iterator<int>(std::cout, " "));

    return arr;
}