Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Помогите перегрузить операторы сравнения ( < > и.т.д.)  (Прочитано 34152 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« : 15-01-2009 11:43 » new

В программе сравниваются объекты одного и тогоже класса, помогите пожалуйста перегрузить операторы сравнения...(Если можно то с примером) Не понял
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-01-2009 11:52 » 

А что там перегружать? делаешь метод bool operator>(const Class &second) и сравниваешь внутри, как тебе надо.
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 15-01-2009 11:54 » 

А что там перегружать? делаешь метод bool operator>(const Class &second) и сравниваешь внутри, как тебе надо.
а поподробней можно...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 15-01-2009 11:55 » 

образно говоря, так:



Код:
class myclass
{
  ...

  bool (operator >) (const Class &second) const;

};



 bool (myclass::operator >) (const Class &second) const
 {
    if((*this)>second)
    {
      return true;
    }
    else
    {
      return false;
    }
 }
« Последнее редактирование: 15-01-2009 11:58 от Алексей1153++ » Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 15-01-2009 11:57 » 

Алексей1153++, может,
Код:
if (this < &second)?
Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 15-01-2009 11:58 » 

ага, уже исправил )))

Янус, и, собственно, ((*this)>second - это место, где будешь сравнивать
Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 15-01-2009 12:08 » 

образно говоря, так:



Код:
class myclass
{
  ...

  bool (operator >) (const Class &second) const;

};



 bool (myclass::operator >) (const Class &second) const
 {
    if((*this)>second)
    {
      return true;
    }
    else
    {
      return false;
    }
 }

ага, уже исправил )))

Янус, и, собственно, ((*this)>second - это место, где будешь сравнивать

Господа я вот тут подумал... Есть следующая программа(пирамидальная сортировка)
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
class massiv {
int size;
int *mas;
public:
massiv(int n);
~massiv(){delete [] mas;}
massiv(const massiv &o);
int get(int i);
void put(int i,int a);
void sift(massiv &o,int L,int R);
void heapsort(massiv &o,int size);
    friend ostream & operator << (ostream &,const massiv &);
friend istream & operator >> (istream &, const massiv &);
massiv operator =(massiv o);
};
massiv::massiv(int n)
{
size=n;
mas=new int[size];
if(mas==NULL)
{
cout<<"No massiv";
exit(1);
}
}
massiv::massiv(const massiv &o)
{
int i;
mas=new int [o.size];
for(i=0;i<o.size;i++)
{
mas[i]=o.mas[i];
}
}
int massiv::get(int i)
{
return mas[i];
}
void massiv::put(int i,int a)
{
mas[i]=a;
}

 void massiv:: sift (massiv &o,int L,int R)
{
int i,j;
int item;
i=L;
j=2*L;
item=o.get(L);
if(j<R && o.get(j) < o.get(j+1)) j++;
while (j<=R && item < o.get(j))
{
o.mas[i]=o.mas[j];
/*a=o.get(j);
o.put(i,a);*/
i=j;
j=2*j;
if(j<R && o.get(j) < o.get(j+1)) j++;
}
o.put(i,item);
}
 void massiv:: heapsort(massiv &o,int size)
{
int L,R;
int item;
L=size/2;
R=size-1;
while(L>0)
{
L--;
sift(o,L,R);
}
while(R>0)
{
item=o.get(0);
o.mas[0]=o.mas[R];
/*a=o.get(R);
o.put(0,a);*/
//mas[R]=item;
o.put(R,item);
R--;
sift(o,L,R);
}
}
ostream & operator << (ostream & out, const massiv &o)
{
for(int i=0;i<o.size;i++)
{
out << o.mas[i] << " ";
     
}
    out << "\nPress key \ " "to continue...." << endl;
return out;
}
istream & operator >> (istream & in, const massiv &o)
{
for(int i=0;i<o.size;i++)
{
in >> o.mas[i];
}
return in;
}
massiv massiv::operator =(massiv o)
{
for(int i=0;i<size;i++)
{
mas[i]=o.mas[i];
}
return *this;
}


void main()
{
int size;
//int *mas;
cout << "Heapsort.\nEnter dimention array:";
cin >> size;
//mas=new int[size];
massiv a(size);
cout << "Enter " << size << " elements: ";
cin >> a;
a.heapsort(a,size);//!!!!
cout << "Your array after sorting: ";
cout << a;
getchar();
}
Может перегрузка этих операторов в ней будет лишней. И пожалуйста оцените взглядом экспертов сие творение...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 15-01-2009 12:51 » 

на глаз - ужасть , а работает ? Улыбаюсь
Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 15-01-2009 12:52 » 

на глаз - ужасть , а работает ? Улыбаюсь

Работает. А почему ужас?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 15-01-2009 16:44 » 

форматирование некрасивое.

а что оценить то нужно, если работает ? )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 15-01-2009 17:14 » 

1. Форматирование
2. Индексы не проверяются в ф-ях get/put и операторах
3. Подумай как будет выглядеть выполнение след операции:
         
          massiv m1(2);
          m1.put(1);
          m1.put(2);
          m1 = m1;
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 16-01-2009 22:48 » 

Господа тут возникла новая проблема. Препод хочет что бы сортировался не массив а список( причем не элементы списка а ссылки, исходный список при этом должен оставатся неизменным). Растолкуйте пожалуйста что и как надо изменить в моей программе, а то не могу понять с какого конца взятся....
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 16-01-2009 22:53 » 

Янус, как организован список - двусвязный? Что означает "не элементы списка, а ссылки" и требование о неизменности исходного списка? Либо ссылки содержатся не в элементах, либо исходный список не сохранить неизменным без создания копии (возможно, в процессе сортировки).
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 16-01-2009 23:02 » 

Янус, как организован список - двусвязный? Что означает "не элементы списка, а ссылки" и требование о неизменности исходного списка? Либо ссылки содержатся не в элементах, либо исходный список не сохранить неизменным без создания копии (возможно, в процессе сортировки).

Я думаю подойдет и односвязный список(это как-то преподом не оговаривалось) думаю надо сделать его копию.
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 16-01-2009 23:05 » 

В принципе вот что от меня хотят (первоисточник блин):

1) Сортировать нужно не массив, а список.
2) В списке Должны сортироваться ссылки, а не информационные части
3) Исходный список должен оставаться неизменным, т.е. в главной процедуре должен быть фрагмент:

void main()
{
list a, b;
....


 b=a.heapsort();//!!!!
 cout << "Your array after sorting: ";
 cout << b;
 cout << "\nPress key \ " "to continue...." << endl;
getchar();
}
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 16-01-2009 23:20 » 

Ну, в сущности, всё будет примерно так же, только обменивать нужно будет не значения двух элементов, а значения ссылкок на next и prev. Только не уверен, что односвязный список подойдёт - там, судя по алгоритму, есть движение и вперёд, и назад по списку.
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 16-01-2009 23:29 » 

Ну, в сущности, всё будет примерно так же, только обменивать нужно будет не значения двух элементов, а значения ссылкок на next и prev. Только не уверен, что односвязный список подойдёт - там, судя по алгоритму, есть движение и вперёд, и назад по списку.

Так а теперь если можно поподробней... То есть я создаю двухсвязный динамический список, затем сортирую ссылки на предидущий и на следующий элементы ? А по какому принципу определять какой больше элемент какой меньший? Сортируем то не элементы списка а ссылки? Если сморозил глупость просьба больно не пинать...
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 16-01-2009 23:55 » 

Сортируешь ссылки, а сравниваешь-то элементы Улыбаюсь Я так понимаю, смысл в том, чтобы не копировать сами элементы (они могут быть в общем случае достаточно тяжёлыми), а совершить обмен местами в списке.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 17-01-2009 11:10 » 

Вад, я думаю, речь идёт о таком списке, где узлы являются контейнерами для данных, тогда менять нужно лишь ссылки в узлах, не перестраивая цепочку узлов.

Типа
Код: (C)
struct Data {
 /* какие-то данные */
};

struct ListNode {
 struct Data *data;
 struct ListNode *next;
};
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 17-01-2009 11:18 » 

Вад, я думаю, речь идёт о таком списке, где узлы являются контейнерами для данных, тогда менять нужно лишь ссылки в узлах, не перестраивая цепочку узлов.

Типа
Код: (C)
struct Data {
 /* какие-то данные */
};

struct ListNode {
 struct Data *data;
 struct ListNode *next;
};
А поподробней... Я вот все думаю как скрестить осла и трепетную лань..Двусвязный список создал, а вот что делать дальше ?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 17-01-2009 11:22 » 

Янус, дальше - всё так же ходишь по списку, сравниваешь данные, и если нужен обмен - меняешь ссылки (а не копируешь между собой данные).
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 17-01-2009 11:44 » 

А у этой задачи есть скажем так "классическое название" типа сортировка списка методом...Мне бы теорию почитать, а то тыкаюсь как слепой Здесь была моя ладья...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 17-01-2009 14:54 » 

Янус, нету. Вообще списки для эффективной сортировки подходят хуже, чем массивы, в силу их природы - последовательного доступа к элементам. Эта природа ограничивает класс алгоритмов сортировки, эффективных в данном случае.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 17-01-2009 14:59 » 

Господа я сейчас напишу односвязный список, а затем не могли бы Вы помочьмне засунуть его в эту сортировку. А то мозг уже кипит....
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 17-01-2009 16:57 » 

Если памяти не жалко, можно через временный массив.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 17-01-2009 17:47 » 

Памяти то не жалко а вот как это сделать ? Я в полном ауте.... Сколько об стенку не бейся...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 17-01-2009 19:16 » 

Янус, к примеру, у тебя в списке - точно M элементов. Элемент списка - как предложил Димка
Код:
struct Data {
 /* какие-то данные */
};

struct ListNode {
 Data *data;
 ListNode *next;
};

сортировка
Код:
//создаёшь временный массив с указателями на данные
Data** ppTempArray=new Data*[M];

//заполняешь массив из списка
ListNode* pCurrNode=...;//(адрес первого элемента списка)
for(int i=0; pCurrNode && i<M; i++)
{
   ppTempArray[i]=pCurrNode->data;
   pCurrNode=pCurrNode->next;
}

//сортируешь массив ppTempArray
//...

//меняем список в соответствие с сортированным масивом
pCurrNode=...;//(адрес первого элемента списка)
for(i=0; pCurrNode && i<M; i++)
{
   pCurrNode->data=ppTempArray[i];
   pCurrNode=pCurrNode->next;
}

delete [] ppTempArray;
ppTempArray=0;

(не тестировал)
Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 17-01-2009 19:34 » 

Ясно сейчас попробую...
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 17-01-2009 21:11 » 

Вот на этот участок что-то ругается....
Код:

element** TempArray=new element* [5];
    element* temp=first;
for(int i=0;temp && i<5;i++)
{
int a1=int(temp->a);
TempArray[i]=a1;///!!!!!
temp=temp->next;
}

мол не могу конвертировать element в int и все тут....
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #29 : 17-01-2009 21:33 » 

а какого типа у тебя temp->a  ? )
Записан

Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines