URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2281
[ Назад ]

Исходное сообщение
"как сделать хэш map ?"

Отправлено neomag , 14-Ноя-03 14:16 
---------------
#include <map>
#include <iostream>

class IP
{
  public:
  int a;
  int b;
  int c;
  int d;
};

int main() {

map <IP, int> ip_balance;

IP ip;

ip_balance[ip]++;

return 0;
}
-------------------------
(упрощенная вырезка)

не компилируется, говорит:

/usr/include/c++/3.2.2/bits/stl_function.h: In member function `bool
   std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = IP]':
/usr/include/c++/3.2.2/bits/stl_map.h:224:   instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = IP, _Tp = int, _Compare = std::less<IP>, _Alloc = std::allocator<std::pair<const IP, int> >]'
test.cpp:28:   instantiated from here
/usr/include/c++/3.2.2/bits/stl_function.h:197: no match for `const IP& < const
   IP&' operator
-----------------
понимаю, что вопрос ламерский -ногами не пинать.


Содержание

Сообщения в этом обсуждении
"как сделать хэш map ?"
Отправлено SergeiZz , 14-Ноя-03 15:54 
Первым должен идти тип ключа, а не тип значения, то есть не
>map <IP, int> ip_balance;
а
map<int, IP> ip_balance;

>понимаю, что вопрос ламерский -ногами не пинать.
Чай сам давно догадался...


"как сделать хэш map ?"
Отправлено neomag , 14-Ноя-03 16:34 
>Первым должен идти тип ключа, а не тип значения, то есть не

>map<int, IP> ip_balance;
>

>Чай сам давно догадался...

ээ, так вот мне бы и хотелось иметь в качестчве ключа тип 'IP'
а значением кол-во байтов ушедших на этот ip.


"как сделать хэш map ?"
Отправлено asso , 15-Ноя-03 05:14 
Ох...  STL хорошая штука, но если не прочитать сначала по нему книгу, потом книгу по С++, потом снова по STL, то не стоит пытаться его использовать.  Проверено на собственном опыте.

#include <map>
#include <iostream>

class IP
{
    friend bool operator < (const IP &ip1, const IP &ip2);

    public:
        int a;
        int b;
        int c;
        int d;

};

bool operator < (const IP &ip1, const IP &ip2)
{
    return ......;
}


int main(int argc, char *argv[])
{
    std::map<IP, int> ip_balance;

    IP ip;

    ip_balance[ip]++;

    return 0;
}


Обрати внимание на оператор "меньше", без него std::map работать не будет. Ну и не забывай про конструктор копирования.