Янус
|
|
« : 15-01-2009 11:43 » |
|
В программе сравниваются объекты одного и тогоже класса, помогите пожалуйста перегрузить операторы сравнения...(Если можно то с примером)
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 15-01-2009 11:52 » |
|
А что там перегружать? делаешь метод bool operator>(const Class &second) и сравниваешь внутри, как тебе надо.
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #2 : 15-01-2009 11:54 » |
|
А что там перегружать? делаешь метод bool operator>(const Class &second) и сравниваешь внутри, как тебе надо.
а поподробней можно...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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++ »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #4 : 15-01-2009 11:57 » |
|
Алексей1153++, может,
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 15-01-2009 11:58 » |
|
ага, уже исправил )))
Янус, и, собственно, ((*this)>second - это место, где будешь сравнивать
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #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(); }
Может перегрузка этих операторов в ней будет лишней. И пожалуйста оцените взглядом экспертов сие творение...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 15-01-2009 12:51 » |
|
на глаз - ужасть , а работает ?
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #8 : 15-01-2009 12:52 » |
|
на глаз - ужасть , а работает ? Работает. А почему ужас?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 15-01-2009 16:44 » |
|
форматирование некрасивое.
а что оценить то нужно, если работает ? )
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Янус
|
|
« Ответ #11 : 16-01-2009 22:48 » |
|
Господа тут возникла новая проблема. Препод хочет что бы сортировался не массив а список( причем не элементы списка а ссылки, исходный список при этом должен оставатся неизменным). Растолкуйте пожалуйста что и как надо изменить в моей программе, а то не могу понять с какого конца взятся....
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #12 : 16-01-2009 22:53 » |
|
Янус, как организован список - двусвязный? Что означает "не элементы списка, а ссылки" и требование о неизменности исходного списка? Либо ссылки содержатся не в элементах, либо исходный список не сохранить неизменным без создания копии (возможно, в процессе сортировки).
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #13 : 16-01-2009 23:02 » |
|
Янус, как организован список - двусвязный? Что означает "не элементы списка, а ссылки" и требование о неизменности исходного списка? Либо ссылки содержатся не в элементах, либо исходный список не сохранить неизменным без создания копии (возможно, в процессе сортировки).
Я думаю подойдет и односвязный список(это как-то преподом не оговаривалось) думаю надо сделать его копию.
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #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(); }
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #15 : 16-01-2009 23:20 » |
|
Ну, в сущности, всё будет примерно так же, только обменивать нужно будет не значения двух элементов, а значения ссылкок на next и prev. Только не уверен, что односвязный список подойдёт - там, судя по алгоритму, есть движение и вперёд, и назад по списку.
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #16 : 16-01-2009 23:29 » |
|
Ну, в сущности, всё будет примерно так же, только обменивать нужно будет не значения двух элементов, а значения ссылкок на next и prev. Только не уверен, что односвязный список подойдёт - там, судя по алгоритму, есть движение и вперёд, и назад по списку.
Так а теперь если можно поподробней... То есть я создаю двухсвязный динамический список, затем сортирую ссылки на предидущий и на следующий элементы ? А по какому принципу определять какой больше элемент какой меньший? Сортируем то не элементы списка а ссылки? Если сморозил глупость просьба больно не пинать...
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #17 : 16-01-2009 23:55 » |
|
Сортируешь ссылки, а сравниваешь-то элементы Я так понимаю, смысл в том, чтобы не копировать сами элементы (они могут быть в общем случае достаточно тяжёлыми), а совершить обмен местами в списке.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #18 : 17-01-2009 11:10 » |
|
Вад, я думаю, речь идёт о таком списке, где узлы являются контейнерами для данных, тогда менять нужно лишь ссылки в узлах, не перестраивая цепочку узлов. Типа struct Data { /* какие-то данные */ };
struct ListNode { struct Data *data; struct ListNode *next; };
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Янус
|
|
« Ответ #19 : 17-01-2009 11:18 » |
|
Вад, я думаю, речь идёт о таком списке, где узлы являются контейнерами для данных, тогда менять нужно лишь ссылки в узлах, не перестраивая цепочку узлов. Типа struct Data { /* какие-то данные */ };
struct ListNode { struct Data *data; struct ListNode *next; }; А поподробней... Я вот все думаю как скрестить осла и трепетную лань..Двусвязный список создал, а вот что делать дальше ?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #20 : 17-01-2009 11:22 » |
|
Янус, дальше - всё так же ходишь по списку, сравниваешь данные, и если нужен обмен - меняешь ссылки (а не копируешь между собой данные).
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #21 : 17-01-2009 11:44 » |
|
А у этой задачи есть скажем так "классическое название" типа сортировка списка методом...Мне бы теорию почитать, а то тыкаюсь как слепой
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #22 : 17-01-2009 14:54 » |
|
Янус, нету. Вообще списки для эффективной сортировки подходят хуже, чем массивы, в силу их природы - последовательного доступа к элементам. Эта природа ограничивает класс алгоритмов сортировки, эффективных в данном случае.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Янус
|
|
« Ответ #23 : 17-01-2009 14:59 » |
|
Господа я сейчас напишу односвязный список, а затем не могли бы Вы помочьмне засунуть его в эту сортировку. А то мозг уже кипит....
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #24 : 17-01-2009 16:57 » |
|
Если памяти не жалко, можно через временный массив.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Янус
|
|
« Ответ #25 : 17-01-2009 17:47 » |
|
Памяти то не жалко а вот как это сделать ? Я в полном ауте....
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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;
(не тестировал)
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #27 : 17-01-2009 19:34 » |
|
Ясно сейчас попробую...
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #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 и все тут....
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #29 : 17-01-2009 21:33 » |
|
а какого типа у тебя temp->a ? )
|
|
|
Записан
|
|
|
|
|