我已经编写了一个代码来循环旋转整数数组。 例如 给定数组-1 2 3 4 5 6 7 8 输出数组-8 1 2 3 4 5 6 7
我面临的问题是,如果我在某个时候使用了自动关键字,那么它会给出奇怪的结果,这超出了我的理解。有人可以帮我总结一下问题吗?
#include<iostream>
#include<bits/stdc++.h>
#include <typeinfo>
using namespace std;
void rotate_one_by_one(array<int, 8> &arr)
{
auto temp = arr[arr.size() - 1];
//auto i = arr.size() - 2; // Output : 1 2 3 4 5 6 7 8
int i = arr.size() - 2; // Output : 8 1 2 3 4 5 6 7
for(; i > -1; --i)
{
arr[i+1] = arr[i];
}
arr.at(i+1) = temp;
}
void cyc_rotate(array<int, 8> &arr)
{
rotate_one_by_one(arr);
cout<<"After cyclic rotate\n";
for(auto n : arr)
cout<<n<<" ";
}
int main()
{
array<int, 8> arr = {1,2,3,4,5,6,7,8};
cyc_rotate(arr);
return 0;
}
请在代码中找到我已经提到使用auto和int类型的输出的注释行。如果仍然无法获得我要传达的信息,请告诉我。
答案 0 :(得分:4)
arr.size()
函数的返回值具有无符号类型std::size_t
。如果变量是auto i
,它也将变成std::size_t
类型。由于它是无符号的,所以永远无法达到小于0的值。
for(; i > -1; --i)
-1
在此处转换为无符号值,最有可能转换为std::numeric_limits<size_t>::max()
或SIZE_MAX
。由于在这种情况下,i
永远不会大于该值,因此循环将永远不会进入。
答案 1 :(得分:3)
auto i = arr.size() - 2
使i
成为std::size_t
类型的变量,该变量是unsigned
的整数。它永远不会是负面的。与-1
的比较通过向其添加-1
将size_t
提升为std::numeric_limits<std::size_t>::max() + 1
。
您的i
不能大于此值,因此永远不会进入循环。
您可以使用for(; i != static_cast<decltype(i)>(-1); --i)
或更高级的方法来挽救病情,请使用std::rotate
:
#include <algorithm> // std::rotate
#include <array>
#include <iostream>
int main() {
std::array<int, 8> arr = {1, 2, 3, 4, 5, 6, 7, 8};
std::rotate(arr.begin(), std::prev(arr.end()), arr.end());
for(auto i : arr) std::cout << i << " ";
std::cout << "\n";
}
请勿使用标题<bits/stdc++.h>
。这是非标准的,您永远不会知道自己是否能获得所需的东西,但是您肯定会包含很多不需要的东西。