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
- 或者将
更改为int,以便对有符号与无符号进行比较,这将导致编译器警告,或者将int与x64中的较大值进行比较i
- 为
使用一个新类型,在x86中为long,在x64中为long,现在当对象在x64中不超过2^63时,i>=0是好的(最有可能)i
- 当
时,在循环内中断i==0
- 更改为正常的
和i=0
方法i
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;
}