c ++ переопределить operator <() и operator! = ()

0

У меня есть реализация очереди:

#include<iostream>
using namespace std;

template <typename T>
struct elem_q
{
T inf;
elem_q<T>* link;
};

template <typename T = int>
class Queue
{
public:
    Queue();
    ~Queue();
    Queue(const Queue&);
    Queue& operator= (const Queue&);

    bool empty()const;
    void push(const T&);
    void pop(T&);
    void head(T&) const;
    void print();
    int length();

    private:
    elem_q<T> *front;
    elem_q<T> *rear;

    void copyQueue(const Queue<T>);
    void deleteQueue();
};

template <typename T>
Queue<T>::Queue()
{
front = rear = NULL;
}

template <typename T>
Queue<T>::~Queue()
{
  deleteQueue();
}

template <typename T>
Queue<T>::Queue(const Queue<T>& r)
{
copyQueue(r);
}

template <typename T>
Queue<T>& Queue<T>::operator=(const Queue<T>& r)
{
if(this != &r)
{
    deleteQueue();
    copyQueue(r);
}
return *this;
}

template <typename T>
void Queue<T>::copyQueue(const Queue<T> r)
{
front = rear = NULL;
elem_q<T> *p = r.front;
while(p)
{
    push(p->inf);
    p = p->link;
}
}

template <typename T>
void Queue<T>::deleteQueue()
{
T x;
while (!empty())
{
    pop(x);
}
}

template <typename T>
bool Queue<T>::empty() const
{
return rear == NULL;
}

template <typename T>
void Queue<T>::push(const T& x)
{
elem_q<T> *p = new elem_q<T>;
p->inf = x;
p->link = NULL;
if (rear) rear->link = p;
else front = p;
rear = p;
}

template <typename T>
void Queue<T>::pop(T& x)
{
if(empty())
{
    cout<<"The queue is empty.\n";
}
else
{
    elem_q<T> *q = front;
    x = q->inf;
    if (q == rear)
    {
        rear = NULL;
        front = NULL;
    }
    else front = q->link;
    delete q;
}
}

template <typename T>
void Queue<T>::head(T& x) const
{
if(empty())
{
    cout<<"The queue is empty.\n";
}
else
{
    x = front->inf;
}
}

template <typename T>
void Queue<T>::print()
{
T x;
while(!empty())
{
    pop(x);
    cout<<x<<" ";
}
cout<<endl;
}

template <typename T>
int Queue<T>::length()
{
T x;
int n = 0;
while(!empty())
{
    pop(x);
    n++;
}
return n;
}
template<typename T>
void minqueue(Queue<T> q,T& min,Queue<T>& newq)
{
T x;
q.pop(min);
while (!q.empty())
{
    q.pop(x);
    if (x < min)
    {
        newq.push(min);
        min = x;
    }
    else newq.push(x);
}

}
template<typename T>
void sortQueue(Queue<T> q,Queue<T>& newq)
{
while(!q.empty())
{
    T min;
    Queue<T> q1;
    minqueue(q , min ,q1);
    newq.push(min);
    q = q1;
}

}
template<typename T>
Queue<T> merge(Queue<T> p,Queue<T> q,const T& dummy)
{
p.push(dummy);
q.push(dummy);
Queue<T> r;
T x,y;
p.pop(x);
q.pop(y);
while (!p.empty() && !q.empty())
    if (x < y)
    {
        r.push(x);
        p.pop(x);
    }
    else
    {
        r.push(y);
        q.pop(y);
    }
if (!p.empty())
    do
    {
        r.push(x);
        p.pop(x);
    }while (x != dummy);
else 
    do
    {
        r.push(y);
        q.pop(y);
    }while (y != dummy);
    return r;
}

Как я могу переопределить оператор <и! =, Потому что без них функция minqueue, Sortqueue и merge не работают? Пожалуйста, помогите мне...............................................

  • 3
    Google "C ++ оператор перегрузки" .
  • 0
    Вы должны перегружать операторы <и! = Не для класса Queue, а для экземпляров класса, которые вы храните в контейнере.
Теги:
operator-keyword
operator-overloading

3 ответа

1
template <typename T>
struct elem_q
{
T inf;
elem_q<T>* link;
};

template <typename T>
bool operator <( const elem_q<T> &lhs, const elem_q<T> &rhs )
{
   return ( lhs.inf < rhs.inf );
} 

template <typename T>
bool operator ==( const elem_q<T> &lhs, const elem_q<T> &rhs )
{
   return ( lhs.inf == rhs.inf );
} 

template <typename T>
bool operator !=( const elem_q<T> &lhs, const elem_q<T> &rhs )
{
   return ( !( lhs.inf == rhs.inf ) );
} 
  • 0
    это кажется хорошим, но почему эти 3 функции все еще не работают. Когда я запускаю его, у меня перестает работать массаж example.exe .... поэтому моя программа убита
  • 0
    @ user3050163 Я не думаю, что проблема с операторами. Я думаю, что причина в вашем коде.
Показать ещё 3 комментария
0

Посмотрите, как вы это сделали:

template <typename T>
Queue<T>& Queue<T>::operator=(const Queue<T>& r)
{
    if(this != &r)
    {
        deleteQueue();
        copyQueue(r);
    }
    return *this;
}

Перегрузите и другие операторы, которые вам нужны.

0

Ну, логические операторы имеют довольно ожидаемый синтаксис, выглядящий так:

  bool ClassName::operator!=(const ClassName& other) const {
      return //compare as apropriate.
  }

Однако я должен отметить две вещи:

  • Во-первых, вам действительно нужно снова пройти дизайн класса → существуют дикие несоответствия в использовании ссылок, странный API, и я даже не уверен, что именно должен делать minqueue, или, вернее, почему он делает то, что он делает.
  • Во-вторых, если вы хотите иметь собственную сортировку, которая идет от минимального элемента и такого, вы должны искать очередь приоритетов или кучу.
  • 0
    Я также добавлю примечание о деструктивной length() и print() .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню