Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Перегрузка оператора ==


Автор: User008 30.10.2009, 00:17
Код

#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) то же самое.
Почему так происходит и как исправить?

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

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

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

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

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

Автор: mes 30.10.2009, 02:54
Цитата(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> 
...

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

Автор: mes 30.10.2009, 03:08
попробовал код из первого поста.. все работает.
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 

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

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

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

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

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

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

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

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

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

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

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

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)