Проблема с ключевым словом Auto в C ++ - PullRequest
1 голос
/ 12 июня 2019

Я написал код для циклического вращения массива целых чисел.Например, для данного массива - 1 2 3 4 5 6 7 8 Выходной массив - 8 1 2 3 4 5 6 7

Проблема, с которой я сталкиваюсь, если я использую ключевое слово auto в какой-то момент, тогда это страннорезультат, который находится за пределами моего понимания.Кто-нибудь, пожалуйста, помогите мне в обобщении проблемы?

#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 ]

4 голосов
/ 12 июня 2019

Возвращаемое значение функции 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 никогда не будет больше этого значения, цикл никогда не будет введен.

3 голосов
/ 12 июня 2019

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>.Это нестандартно, и вы никогда не узнаете, получите ли вы то, что вам нужно, но вы наверняка включите в себя многое, что вам не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...