Перегрузка оператора в очереди - PullRequest
0 голосов
/ 03 мая 2020

так что я пытаюсь перегрузить оператор - в очереди, чтобы удалить общие номера с другой очередью из очереди. пример: очередь A: [5 4 3 7] очередь B: [5 2 1 7]

AB

A = [4 3]

я сделал это:

CFilaInteiros& operator-(const CFilaInteiros& b)
    {
    if ( inicio == NULL )
    cout << "Fila vazia..." << endl;
    else
    {
        CNoFila * aux = inicio;
        while( aux != NULL )
        {
            if(aux->dados==b->dados) retiraDaFila(aux->dados);
            aux = aux->proximo;
        }
    }
}

Я пишу это, потому что это говорит, что я должен Mutch код, вот заголовок:

#ifndef CFilaInteiros_h
#define CFilaInteiros_h

using namespace std;

class CFilaInteiros;

class CNoFila{
    int dados;
    CNoFila *proximo;

    friend class CFilaInteiros; // permite a esta classe aceder atributos private
};

class CFilaInteiros
{
private:
    CNoFila *inicio, *fim;
public:
    CFilaInteiros(void);
    ~CFilaInteiros(void);

    void insereNaFila(const int item);
    bool retiraDaFila(int &item);
    void escreveFila(void) const;
    bool filaVazia(void) const { return (inicio == NULL ); }
    CFilaInteiros& operator-(const CFilaInteiros& b)
    {

        if ( inicio == NULL )
        cout << "Fila vazia..." << endl;
        else
        {
            CNoFila * aux = inicio;
            while( aux != NULL )
            {
                if(aux->dados==b->dados) retiraDaFila(aux->dados);
                aux = aux->proximo;
            }
        }
    }

};

#endif

retiradafila (берет узел из очереди):

bool CFilaInteiros::retiraDaFila(int &item){
 if (inicio == NULL) return false; 


 item = inicio->dados;


 CNoFila * aux = inicio;
 inicio = aux->proximo;

 if (inicio == NULL) fim = NULL;
 delete aux;   
 return true;  
}

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы отправили:

CFilaInteiros& operator-(const CFilaInteiros& b)
{
    ...
    CNoFila * aux = inicio;
    while( aux != NULL )
    {
        if(aux->dados==b->dados) retiraDaFila(aux->dados);
        aux = aux->proximo;
    }
}

Но b->dados неверно (b не указатель, а CFilaInteiros не имеет dados), и вы перебираете A, но не B, который не может работать.

Я предлагаю вам перебрать B:

CNoFila * aux = b.inicio;
while( aux != NULL )
  {
    retiraDaFila(aux->dados);
    aux = aux->proximo;
  }
0 голосов
/ 03 мая 2020

Наслаждайтесь: D

#include <vector>
#include <iostream>
using namespace std;

class Queue {
public:
    vector<int> container;

    Queue(vector<int> items) : container(items) {
    }

    void operator-(const Queue& other) {
        vector<int> resultContainer;
        for (size_t i=0; i<container.size(); ++i) {
            if (container[i] != other.container[i]) {
                resultContainer.push_back(container[i]);
            }
        }
        container.clear();
        for (int item : resultContainer) {
            container.push_back(item);
        }
    }

    void printValues() {
        for (int item : container) {
            cout<<item<<" ";
        }
        cout<<endl;
    }
};

int main() {
    Queue A(vector<int>{5,4,3,7});
    Queue B(vector<int>{5,2,1,7});

    cout<<"before:\nA = ";
    A.printValues();
    cout<<"B = ";
    B.printValues();
    cout<<endl;

    A - B;

    cout<<"after:\nA = ";
    A.printValues();
    cout<<"B = ";
    B.printValues();
    cout<<endl;

    cout<<"end"<<endl;
}

Выход:

before:
A = 5 4 3 7 
B = 5 2 1 7 

after:
A = 4 3 
B = 5 2 1 7 

end
...