std::set + std::pair operator< - переопределение
От: Pavel515  
Дата: 14.08.06 06:47
Оценка:
Привет Всем!

"Я еще не волшебник, а только учусь!"

наверное что-то не понимаю!


вот такой код:


typedef pair<int,int> range_t;
bool operator<(const range_t& A,const range_t& B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};
typedef set<range_t> ranges_t;

мой оператор "<" остается за бортом! ваполняется стандартный из <utility>


#include <utility>
template<class _T1, class _T2> inline
bool __cdecl operator<(const pair<_T1, _T2>& _X,
const pair<_T1, _T2>& _Y)
{return (_X.first < _Y.first ||
!(_Y.first < _X.first) && _X.second < _Y.second); }


как переопределить оператор "<" для типа range_t

C уважением, Павел.
Если хочешь выиграть в лотерею, то купи, хотя-бы лотерейный билет. (В.Мэгре)
Re: std::set + std::pair operator< - переопределение
От: Какая разница Украина  
Дата: 14.08.06 06:54
Оценка:
Здравствуйте, Pavel515, Вы писали:

P>Привет Всем!


P>"Я еще не волшебник, а только учусь!"


P>наверное что-то не понимаю!



P>вот такой код:



P>typedef pair<int,int> range_t;

P>bool operator<(const range_t& A,const range_t& B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};
P>typedef set<range_t> ranges_t;

P>мой оператор "<" остается за бортом! ваполняется стандартный из <utility>



P>#include <utility>

P>template<class _T1, class _T2> inline
P> bool __cdecl operator<(const pair<_T1, _T2>& _X,
P> const pair<_T1, _T2>& _Y)
P> {return (_X.first < _Y.first ||
P> !(_Y.first < _X.first) && _X.second < _Y.second); }


P>как переопределить оператор "<" для типа range_t


P>C уважением, Павел.


Надеюсь конструируеш set и задаеш предикат сравнения


explicit set(const Pred& comp = Pred(), const A& al = A());
!0xDEAD
Re: std::set + std::pair operator< - переопределение
От: KBH  
Дата: 14.08.06 07:00
Оценка:
Наверное во так:
typedef std::pair<int,int> Range_t;

struct RangeLess : std::binary_function<Range_t, Range_t, bool> {
    bool operator()(const Range_t& a, const Range_t& b) const {
        return ( a.first < b.first ) && ( a.second < b.second ) && (a.second < b.first );
    }
};
    
//  ...
    using namespace std;
    set<Range_t, RangeLess> s;
//  ...
}
Re[2]: std::set + std::pair operator< - переопределение
От: Pavel515  
Дата: 14.08.06 07:10
Оценка:
Здравствуйте, Какая разница, Вы писали:

КР>Здравствуйте, Pavel515, Вы писали:


P>>Привет Всем!


P>>"Я еще не волшебник, а только учусь!"


P>>наверное что-то не понимаю!



P>>вот такой код:



P>>typedef pair<int,int> range_t;

P>>bool operator<(const range_t& A,const range_t& B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};
P>>typedef set<range_t> ranges_t;

P>>мой оператор "<" остается за бортом! ваполняется стандартный из <utility>



P>>#include <utility>

P>>template<class _T1, class _T2> inline
P>> bool __cdecl operator<(const pair<_T1, _T2>& _X,
P>> const pair<_T1, _T2>& _Y)
P>> {return (_X.first < _Y.first ||
P>> !(_Y.first < _X.first) && _X.second < _Y.second); }


P>>как переопределить оператор "<" для типа range_t


P>>C уважением, Павел.


КР>Надеюсь конструируеш set и задаеш предикат сравнения



КР>
КР>explicit set(const Pred& comp = Pred(), const A& al = A());
КР>



Нет, а как?

Наверное надо описать функцию:
bool Pred(const ranges_t& A,const ranges_t B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};

а потом

ranges_t ranges( и как-то передать туда этот Pred?)

документации 0! в MSDN примеры им-бы такие примеры! книжка еще не пришла! а работать надо!

С уважением, Павел.
Если хочешь выиграть в лотерею, то купи, хотя-бы лотерейный билет. (В.Мэгре)
Re[2]: std::set + std::pair operator< - переопределение
От: Pavel515  
Дата: 14.08.06 07:18
Оценка:
Здравствуйте, KBH, Вы писали:


KBH>Наверное во так:

KBH>
KBH>typedef std::pair<int,int> Range_t;

KBH>struct RangeLess : std::binary_function<Range_t, Range_t, bool> {
KBH>    bool operator()(const Range_t& a, const Range_t& b) const {
KBH>        return ( a.first < b.first ) && ( a.second < b.second ) && (a.second < b.first );
KBH>    }
KBH>};
    
KBH>//  ...
KBH>    using namespace std;
KBH>    set<Range_t, RangeLess> s;
KBH>//  ...
KBH>}
KBH>



спасибо огромное!

я где-то предпогагал что надо внимательнее изучать инклуды! но был весьма робок! Спасибо ! Павел.

Если хочешь выиграть в лотерею, то купи, хотя-бы лотерейный билет. (В.Мэгре)
Re: std::set + std::pair operator< - переопределение
От: LuckLess Россия  
Дата: 14.08.06 09:01
Оценка:
Здравствуйте, Pavel515, Вы писали:

P>Привет Всем!


P>"Я еще не волшебник, а только учусь!"


P>наверное что-то не понимаю!



P>вот такой код:



P>typedef pair<int,int> range_t;

P>bool operator<(const range_t& A,const range_t& B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};
P>typedef set<range_t> ranges_t;

P>мой оператор "<" остается за бортом! ваполняется стандартный из <utility>



P>#include <utility>

P>template<class _T1, class _T2> inline
P> bool __cdecl operator<(const pair<_T1, _T2>& _X,
P> const pair<_T1, _T2>& _Y)
P> {return (_X.first < _Y.first ||
P> !(_Y.first < _X.first) && _X.second < _Y.second); }


P>как переопределить оператор "<" для типа range_t


P>C уважением, Павел.


Для того, чтобы std::set воспользовался твоим оператором < тебе надо перегрузить std::less<range_t>, так — чтобы тот звал твой оператор.
Re[2]: std::set + std::pair operator< - переопределение
От: Centaur Россия  
Дата: 14.08.06 09:24
Оценка:
Здравствуйте, LuckLess, Вы писали:

P>>typedef pair<int,int> range_t;

P>>bool operator<(const range_t& A,const range_t& B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};

P>>typedef set<range_t> ranges_t;


LL>Для того, чтобы std::set воспользовался твоим оператором < тебе надо перегрузить std::less<range_t>, так — чтобы тот звал твой оператор.


Этого нельзя делать, потому что стандартные шаблоны можно специализировать только для пользовательских типов, а range_t таковым не является — он всего лишь псевдоним для стандартного же std::pair<int, int>.
Re: std::set + std::pair operator< - переопределение
От: Centaur Россия  
Дата: 14.08.06 09:30
Оценка: 3 (2)
Здравствуйте, Pavel515, Вы писали:

P>typedef pair<int,int> range_t;

P>bool operator<(const range_t& A,const range_t& B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};

Этот operator< не удовлетворяет требованиям, накладываемым на предикат сравнения (не является моделью концепции StrictWeakOrdering). В частности, он объявляет эквивалентными все пересекающиеся интервалы. Но из того, что интервалы A, B пересекаются, и B, C пересекаются, вовсе не следует, что A, C будут пересекаться (отношение нетранзитивно). Контрпример: range_t A(0, 2), B(1, 4), C(3, 5). Следовательно, этот предикат нельзя использовать с std::set.

Однако, компилятор игнорирует его не поэтому, а потому, что range_t — это псевдоним стандартного типа std::pair<int, int>, который находится в namespace std, и поэтому operator< тоже берётся из namespace std. Засунуть же свою реализацию чего бы то ни было в namespace std можно только тогда, когда она зависит от какого-либо пользовательского типа.

P>typedef set<range_t> ranges_t;
Re[2]: std::set + std::pair operator< - переопределение
От: Pavel515  
Дата: 14.08.06 10:59
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, Pavel515, Вы писали:


P>>typedef pair<int,int> range_t;

P>>bool operator<(const range_t& A,const range_t& B){return (A.first<B.first)&&(A.second<B.second)&&(A.second<B.first);};

C>Этот operator< не удовлетворяет требованиям, накладываемым на предикат сравнения (не является моделью концепции StrictWeakOrdering). В частности, он объявляет эквивалентными все пересекающиеся интервалы. Но из того, что интервалы A, B пересекаются, и B, C пересекаются, вовсе не следует, что A, C будут пересекаться (отношение нетранзитивно). Контрпример: range_t A(0, 2), B(1, 4), C(3, 5). Следовательно, этот предикат нельзя использовать с std::set.



оно еще и не антисимметрично (A(0,2) B(1,4))

порядок(x,y) = !порядок(y,x)

посто на этапе заполнения все пересекающиеся интервалы уйдут и во множестве остануться только непересекающиеся

задача: в последовательности непересекающихся интервалов (1-2 и 2-3 — пересекаются, а 1-2 и 3-4 — нет), определить: входит ли конкретное одно число а в какой-нибудь интервал множества или нет?

C>Однако, компилятор игнорирует его не поэтому, а потому, что range_t — это псевдоним стандартного типа std::pair<int, int>, который находится в namespace std, и поэтому operator< тоже берётся из namespace std. Засунуть же свою реализацию чего бы то ни было в namespace std можно только тогда, когда она зависит от какого-либо пользовательского типа.


P>>typedef set<range_t> ranges_t;
Если хочешь выиграть в лотерею, то купи, хотя-бы лотерейный билет. (В.Мэгре)
Re: std::set + std::pair operator< - переопределение
От: Roman Odaisky Украина  
Дата: 14.08.06 12:57
Оценка:
Здравствуйте, Pavel515, Вы писали:

P>мой оператор "<" остается за бортом! ваполняется стандартный


Это совсем недавно обсуждалось: http://rsdn.ru/Forum/?mid=1997550
Автор: igna
Дата: 12.07.06
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.