C ++中的自动关键字问题

时间:2019-06-12 10:52:42

标签: c++ data-structures

我已经编写了一个代码来循环旋转整数数组。 例如 给定数组-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类型的输出的注释行。如果仍然无法获得我要传达的信息,请告诉我。

2 个答案:

答案 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的比较通过向其添加-1size_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>。这是非标准的,您永远不会知道自己是否能获得所需的东西,但是您肯定会包含很多不需要的东西。