Russian Qt Forum
Ноябрь 23, 2024, 18:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Преждевременный вызов деструктора  (Прочитано 17384 раз)
Даниил
Гость
« Ответ #15 : Март 13, 2012, 19:02 »

 Шокированный Да я просто так обозвал класс - прекратите холивар!
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #16 : Март 13, 2012, 19:47 »

Шокированный Да я просто так обозвал класс - прекратите холивар!

Да какой ещё холивар) Выпейте лучше стакан холодной воды)

А оператор < вообще бредово определять для данного класса)
Какая точка будет больше p1(10, 1) или p2(1, 10) ?

Согласно вашей реализации p1 окажется больше.. Но с чего это вы нарушаете равноправие между x и y компонентами?
И как конечный пользователь должен досмысливать поведение такого оператора для объекта точки? Это не логично.
Не всегда концептуальность идет в такт с конкретикой/реализацией. Есть вектор точек, надо удалить повторяющиеся. Что будете делать без оператора < ? Или у Вас есть др. предложения как его определить? Так что потише там с "бредово" и.т.п.  Улыбающийся



Тогда у меня вопрос: пусть есть вектор объектов (пусть просто обычных чисел), у которых нет оператора <, но есть операторы (=! ==)  Можно ли выкинуть из вектора повторяющиеся элементы?

И как Вам поможет определённый выше оператор < ?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Март 13, 2012, 20:14 »

Тогда у меня вопрос: пусть есть вектор объектов (пусть просто обычных чисел), у которых нет оператора <, но есть операторы (=! ==)  Можно ли выкинуть из вектора повторяющиеся элементы?

И как Вам поможет определённый выше оператор < ?
Поможет так что я могу спокойно вызывать std::sort, помещать в std::set/map и делать многое другое без всяких усилий. А без оператора < мне придется поизвращаться: писать функторы. или городить хеш или юзать С-шный qsort - все это гораздо менее удобно. Поэтому нет оснований избегать оператора < только на том веском основании что он, дескать, "недостаточно идейный"  Улыбающийся
Записан
BRE
Гость
« Ответ #18 : Март 13, 2012, 20:20 »

Тогда зачем его так усложнять?
Код
C++ (Qt)
bool Coord::operator < ( const Coord & c ) const
{
   if (x < c.x) return true;
   if (x > c.x) return false;
   return y < c.y;
}
 

можно сделать проще:
Код
C++ (Qt)
bool Coord::operator < ( const Coord & c ) const
{
   return x + y < c.x + c.y;    // или перемножать координаты или складывать и брать корень квадратный или ... :)
}
 
Записан
mutineer
Гость
« Ответ #19 : Март 13, 2012, 20:59 »

Тогда у меня вопрос: пусть есть вектор объектов (пусть просто обычных чисел), у которых нет оператора <, но есть операторы (=! ==)  Можно ли выкинуть из вектора повторяющиеся элементы?

И как Вам поможет определённый выше оператор < ?

оператор < более универсален - с его помощь можно сортировать, сравнивать, а так же проверять на равенство. А вот с помощью операторов сравнения только проверять на равенство

Ну если в этих операторах нет странной логики, конечноУлыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #20 : Март 14, 2012, 00:47 »

Тогда у меня вопрос: пусть есть вектор объектов (пусть просто обычных чисел), у которых нет оператора <, но есть операторы (=! ==)  Можно ли выкинуть из вектора повторяющиеся элементы?

И как Вам поможет определённый выше оператор < ?
Поможет так что я могу спокойно вызывать std::sort, помещать в std::set/map и делать многое другое без всяких усилий. А без оператора < мне придется поизвращаться: писать функторы. или городить хеш или юзать С-шный qsort - все это гораздо менее удобно. Поэтому нет оснований избегать оператора < только на том веском основании что он, дескать, "недостаточно идейный"  Улыбающийся

Я бы сделал как-то так:
Код
C++ (Qt)
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
template <class InputIterator, class T>
bool isContains(InputIterator begin, InputIterator end, const T& value)
{
   if (begin == end)
       return (*begin == value);
 
   for (InputIterator it = begin; it != end; ++it) {
       if (*it == value) return true;
   }
   return (*end == value);
}
 
// my_unique - шаблонная функция которая копирует из одного контейнера в другой
// только уникальные элементы
//
template <class InputIterator, class OutputIterator>
OutputIterator my_unique(InputIterator first, InputIterator last,
                              OutputIterator result )
{
   *result=*first;
   OutputIterator begin = result;
   while (++first != last) {
       if (!isContains(begin, result, *first))
         *(++result) = *first;
   }
   return ++result;
}
 
 
using namespace std;
 
int main()
{
   int arr[] = {0,0,1,0,2,9,3,0,0,7,4,5,6,0,7,8,9,0,0};
   const int size = sizeof(arr)/sizeof(arr[0]);
 
   vector<int> v(size);
   vector<int>::iterator it;
 
   it = my_unique(arr, arr+size, v.begin());
   v.resize(it - v.begin());
 
   copy(v.begin(), v.end(), ostream_iterator<int>(cout," "));
 
   return 0;
}
 
 
Вывод
Код
Bash
0 1 2 9 3 7 4 5 6 8
 

Теперь если заменить int на Point у которого есть оператор == то всё получится)
« Последнее редактирование: Март 14, 2012, 00:49 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #21 : Март 14, 2012, 01:11 »

Тогда у меня вопрос: пусть есть вектор объектов (пусть просто обычных чисел), у которых нет оператора <, но есть операторы (=! ==)  Можно ли выкинуть из вектора повторяющиеся элементы?

И как Вам поможет определённый выше оператор < ?

оператор < более универсален - с его помощь можно сортировать, сравнивать, а так же проверять на равенство. А вот с помощью операторов сравнения только проверять на равенство

Ну если в этих операторах нет странной логики, конечно:)
Ясненько)
И как Вы предлагаете сравнивать такие объекты, как вектора? И что значит отсортировать вектора?
Имхо, конечно, но это бред)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Март 14, 2012, 12:29 »

можно сделать проще:
Код
C++ (Qt)
bool Coord::operator < ( const Coord & c ) const
{
   return x + y < c.x + c.y;    // или перемножать координаты или складывать и брать корень квадратный или ... :)
}
 
Ну тогда и оператор == должен быть в масть
Код
C++ (Qt)
bool Coord::operator == ( const Coord & c ) const
{
   return x + y == c.x + c.y;    
}
 
Хмм...  Улыбающийся

Код
C++ (Qt)
return (*end == value);
 
Никто не обещал что end можно разыменовывать

Теперь если заменить int на Point у которого есть оператор == то всё получится)
Вы явно превзошли др фанов STL. У них ракообразные конструкции хоть экономят пару строчек (иногда). У Вас наоборот, увеличивают, + вкупе с линейным перебором. Видимо, это неважно, главное - побольше template, итераторов и вообще - полной абстракции. Улыбающийся
Записан
BRE
Гость
« Ответ #23 : Март 14, 2012, 13:17 »

Ну тогда и оператор == должен быть в масть
Почему? Операторы == и != можно определить и они будут отражать физическую и математическую суть такого сравнения, чего нельзя сказать о операторах < и >. Вот последние можно определять как захочется, мой вариант просто более оптимизированный чем твой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Март 14, 2012, 13:39 »

Почему? Операторы == и != можно определить и они будут отражать физическую и математическую суть такого сравнения, чего нельзя сказать о операторах < и >. Вот последние можно определять как захочется, мой вариант просто более оптимизированный чем твой.
Тогда выходит так
Код
C++ (Qt)
a < b (false)
b < a (false)
a == b (false) Оба-на!
 
Хотя формально не ошибка - как этим пользоваться?  Улыбающийся
Видимо не стоит так уж гнаться за "сутью", проще понимать < как некоторое "отношение" которое может использоваться для упорядочивания
Записан
BRE
Гость
« Ответ #25 : Март 14, 2012, 13:43 »

Видимо не стоит так уж гнаться за "сутью", проще понимать < как некоторое "отношение" которое может использоваться для упорядочивания
Вот правильно.
Тогда повторю вопрос: Для чего у тебя такая сложная логика в этом операторе (по сравнению с моим вариантом)?
« Последнее редактирование: Март 14, 2012, 13:57 от BRE » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Март 14, 2012, 14:12 »

Тогда повторю вопрос: Для чего у тебя такая сложная логика в этом операторе (по сравнению с моим вариантом)?
В Вашем варианте в сортированном массиве возможен такой порядок

(-1, 1)
(-2, 2)
(-1, 1)
Записан
BRE
Гость
« Ответ #27 : Март 14, 2012, 14:13 »

В Вашем варианте в сортированном массиве возможен такой порядок

(-1, 1)
(-2, 2)
(-1, 1)

Да и что?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #28 : Март 14, 2012, 14:20 »

можно сделать проще:
Код
C++ (Qt)
bool Coord::operator < ( const Coord & c ) const
{
   return x + y < c.x + c.y;    // или перемножать координаты или складывать и брать корень квадратный или ... :)
}
 
Ну тогда и оператор == должен быть в масть
Код
C++ (Qt)
bool Coord::operator == ( const Coord & c ) const
{
   return x + y == c.x + c.y;    
}
 
Хмм...  Улыбающийся

Код
C++ (Qt)
return (*end == value);
 
Никто не обещал что end можно разыменовывать

Теперь если заменить int на Point у которого есть оператор == то всё получится)
Вы явно превзошли др фанов STL. У них ракообразные конструкции хоть экономят пару строчек (иногда). У Вас наоборот, увеличивают, + вкупе с линейным перебором. Видимо, это неважно, главное - побольше template, итераторов и вообще - полной абстракции. Улыбающийся


Оператор == для такого объекта, как точка логично определить так:
Код
C++ (Qt)
inline bool operator==(const Point &p1, const Point &p2)
{
   return ((p1.xp == p2.xp) && (p1.yp == p2.yp)) ? true : false;
   // или так:
   /*
   return (norm(p1-p2) <= epsilon);
   norm = x^2+y^2
  */

}
 

Цитировать
Код
C++ (Qt)
return (*end == value);
 
Никто не обещал что end можно разыменовывать
Не понял, почему это его нельзя разыменовывать?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Март 14, 2012, 14:25 »

Да и что?
Это не то что ожидается при нормальном операторе == (x == c.x && y == c.y). Напр удалить повторы из такого сортированного массива мы не сможем
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.295 секунд. Запросов: 23.