C ++ - сравнение отрицательного и положительного числа возвращает false - PullRequest
1 голос
/ 26 мая 2020

Я реализую очередь с использованием вектора в C ++

Я использую переменную sz, чтобы отслеживать, сколько свободных элементов находится в очереди при любой операции вставки / удаления.

I столкнулся с проблемой в моей реализации, где я сравнивал:

sz < vec.size() - 1

В какой-то момент эта строка начала возвращать 0, и сравнение было

-1 < 5

Одна вещь, которая помогла делал это

int vecsz = vec.size() - 1;
int regsz = sz;

if (regsz < vecsz)
{
    sz++;
}

Хотя это помогло, я все еще не понимаю, почему. Может кто-нибудь пролить свет на это, пожалуйста?

queue.h

#include <iostream>
#include <vector>

using namespace std;

template <typename Object>
class queue
{
public:
    queue(int s) 
      : vec(s) 
    {
        sz = s - 1;
    }
    queue () { }
    ~queue() { }

    /**
     * Add element to Q and decrease size 
     */
    void enque(Object obj)
    {
        if (sz >= 0) {
            vec[sz] = obj;
            sz--;
        }
    }

    /**
     * Remove element from Q and increase size 
     */
    Object deque()
    {
        // grab last element
        int last = vec[vec.size() - 1];

        // remove last element from array
        vec.pop_back();

        // insert 0 in the front
        vec.insert(vec.begin(), 0);

        int vecsz = vec.size() - 1;
        int regsz = sz;

        // increase size tracking var
        if (regsz < vecsz)
        {
            sz++;
        }

        return last;
    }

    void print() {
        for (int i = 0; i < vec.size(); ++i) {
            cout << "i: " << vec[i] << endl;
        }
    }

private:
    vector<int> vec;
    int sz;
};

main

int main()
{
    queue<int> Q(5);
    cout << "Empty Q:" << endl; 

    Q.print(); 
    cout << endl;

    Q.enque(1);
    Q.enque(2);
    Q.enque(3);

    cout << "Full Q1:" << endl; 

    Q.print(); 

    cout << "Deque " << endl;
    cout << Q.deque() << " " << Q.deque() << " " << Q.deque() << " " << endl;
    cout << Q.deque() << endl;

    cout << "Print " << endl;
    Q.print(); 

    cout << "Enqueue " << endl;
    Q.enque(10);
    Q.enque(20);
    Q.enque(30);
    Q.enque(40);
    Q.enque(50);

    cout << "\nFull Q2:" << endl; 
    Q.print(); 

    cout << endl;
    cout << Q.deque() << endl;

    Q.enque(100);

    cout << "Full Q3:"; Q.print(); cout << endl;

    cout << Q.deque() << endl;
    cout << Q.deque() << endl;
    cout << Q.deque() << endl;
    cout << Q.deque() << endl;

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 26 мая 2020

Вот почему важно не смешивать подписанные и беззнаковые типы. С помощью

sz < vec.size() - 1

вы сравниваете целое число со знаком с целым числом без знака. Когда вы это сделаете, компилятор преобразует целое число со знаком в тот же тип, что и целое число без знака. Когда вы это делаете, и целое число со знаком оказывается отрицательным, вы получаете значение, которое является максимальным значением беззнакового типа минус значение целого числа со знаком. Таким образом,

-1 < 5

становится

4294967295 (for 32 bits) or 18446744073709551615 (for 64 bits) < 5

, что является ложным.

Чтобы исправить это, сделайте sz тип без знака.

2 голосов
/ 26 мая 2020

vec.size() - целое число без знака. Когда вы сравниваете целочисленный тип без знака с целочисленным типом со знаком того же или меньшего размера, подписанный тип будет преобразован в тот же тип, что и другой. Отрицательные числа не могут быть представлены беззнаковыми типами.

В общем, вам следует избегать сравнения подписанных чисел с беззнаковыми числами из-за проблем, которые вы наблюдали.

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