Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка оператора == 
:(
    Опции темы
User008
Дата 30.10.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: нет
Всего: 1



Код

#include <map>
#include <vector>
using namespace std;

bool deref_equal(int *lhs, int *rhs)
{
    return *lhs == *rhs;
}
bool deref_less(int *lhs, int *rhs)
{
    return *lhs < *rhs;
}

class С
{
private:
    const vector<int *> *V;
public:
    С(const vector<int *> *V) : V(V) {}
    bool operator==(const С &rhs) const
        {
            return std::equal(V->begin(), V->end(), rhs.V->begin(), deref_equal); // Сравнение
        }
    bool operator<(const С &rhs) const
        {
            return std::lexicographical_compare(V->begin(), V->end(), rhs.V->begin(), rhs.V->end(), deref_less);
        }
};

int _tmain(int argc, _TCHAR* argv[])
{
    map<С, int> m;

    int a=10, b=20;
    vector<int*> v;
    v.push_back(&a);
    v.push_back(&b);

    int aa=10, bb=20;
    vector<int*> vv;
    v.push_back(&aa);
    v.push_back(&bb);

    bool f1 = ( m.find(С(&v)) == m.end() ); // find
    m[&v];
    bool ff = ( m.find(С(&vv)) == m.end() ); // find
    bool f2 = ( m.find(С(&v)) == m.end() ); // find
}


При поиске используется сравнение из стандартной библиотеки вместо моего. Для friend bool operator==(const C &lhs , const C &rhs) то же самое.
Почему так происходит и как исправить?
PM MAIL   Вверх
mes
Дата 30.10.2009, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(User008 @  29.10.2009,  23:17 Найти цитируемый пост)
Для friend bool operator==(const C &lhs , const C &rhs)

не вникал в подробности приведенного кода, но имхо не там ищете..
если не ошибаюсь, то для поиска используется оператор <, а не ==. 


--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 30.10.2009, 01:53 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(mes @  30.10.2009,  01:41 Найти цитируемый пост)
если не ошибаюсь, то для поиска используется оператор <

Ошибаетесь, operator< () используется для сортировки.

User008, Пройдись отладчиком, покажи в какой строке ты ожидаешь operator==


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 30.10.2009, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(andrew_121 @  30.10.2009,  00:53 Найти цитируемый пост)
Ошибаетесь, operator< () используется для сортировки.


Цитата

  Table 7--Associative container requirements (in addition to container)
...
  +-----------------------------------------------------------------------------------+
  |X::key_compare Compare        defaults to less<key_type> 
...



--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 30.10.2009, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



mes, Ну да. При вставке значений, ключи по умолчанию сортируются по std::less<>


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 30.10.2009, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



попробовал код из первого поста.. все работает.
m.find() использует пользовательский оператор <().
в 44й сточке не ищет, так как map еще пустой (заполнение происходит на 45й).
 smile

Добавлено через 3 минуты и 29 секунд
P.S. это специально "C" в коде написано кирилицей ? заметаем следы ?!  smile

Добавлено через 4 минуты и 50 секунд
Цитата(andrew_121 @  30.10.2009,  02:07 Найти цитируемый пост)
у да. При вставке значений, ключи по умолчанию сортируются по std::less<> 

и при find для ассоциативных контейнеров, в частности для map o которой у нас идет речь, используется та же Compare функция.
 smile 


--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 30.10.2009, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



mes, У меня получилось что == не вызывается ваще во всей программе. а оператор < вызывается. еще, я не понял, чего именно пытается добиться ТС ?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 30.10.2009, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(andrew_121 @  30.10.2009,  02:15 Найти цитируемый пост)
У меня получилось что == не вызывается ваще во всей программе.

ну так о том и речь с самого начала.. зачем ему там вызываться то ?!  smile 

Цитата(andrew_121 @  30.10.2009,  02:15 Найти цитируемый пост)
еще, я не понял, чего именно пытается добиться ТС ?

использовать свою (перегруженную) операцию сравнения.


--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 30.10.2009, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(mes @  30.10.2009,  03:23 Найти цитируемый пост)
ну так о том и речь с самого начала.. зачем ему там вызываться то ?!

Ааа.. Я то подумал что там ошибка где-то, потому и не вызывается.

Цитата(mes @  30.10.2009,  03:23 Найти цитируемый пост)
использовать свою (перегруженную) операцию сравнения. 

Так она и используется. Вот только оператор== тут при чем?  smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 30.10.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(andrew_121 @  30.10.2009,  03:56 Найти цитируемый пост)
Так она и используется. Вот только оператор== тут при чем?  smile  

Цитата(mes @  30.10.2009,  00:41 Найти цитируемый пост)
не там ищете..

 smile 



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.