Поиск в hash_map

Тема в разделе "LANGS.C", создана пользователем steelfactor, 23 фев 2012.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    В STL не силен, сталкивался пару раз, да и то на пьяную голову, посему прошу совета у коллективного разума:

    Есть простая достаточно клиент-серверая прожка, которая туда-сюда гоняет данные. На сервере ведется учет клиентов в виде hash_map, что-то типа:
    typedef pair < UINT, USER_LIST_NODE * > clientsPair;
    hash_map < UINT, USER_LIST_NODE * > Clients;
    hash_map <UINT, USER_LIST_NODE *>::iterator UsersIterator;

    При логине нового клиента делается:
    USER_LIST_NODE currentUser;
    memset( &currentUser, 0, sizeof(USER_LIST_NODE));
    //заполняем структуру USER_LIST_NODE...
    Clients.insert( clientsPair( counter++, &currentUser));

    При LOGOUT клиента ищем его в хеше, и удаляем запись
    Код (Text):
    1. for(UsersIterator = Clients.begin(); UsersIterator != Clients.end(); UsersIterator++)
    2.                 {
    3.                     if( strcmp (UsersIterator->second->userName, receivedBuffer.message.logoutMember.userName) == 0)
    4.                     {
    5.                         Clients.erase( UsersIterator );
    6.                     }
    7.                 }
    Трабла в том, что сравнение строк strcmp не всегда отрабатывает, при отладке видно, что в UsersIterator->second->userName после имени юзера набит мусор, но так бывает через раз, т.е. один раз функция отработает норм, а второй раз нет.
    Как можно разрулить ситуацию?
    Убедительная просьба не кидать помидорами, очень приветствуется конструктивные пинки в нужном направлении )
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    steelfactor
    Потому что ты удаляешь объект по итератору, а потом этот же итератор инкрементишь. Это неправильно. Надо так:

    Код (Text):
    1. auto it = container.begin()
    2.  
    3. while(it != container.end())
    4. {
    5.     auto old = it++;
    6.     if(условие с old)
    7.     {
    8.         действия с old;
    9.         container.erase(old);
    10.     }
    11. }
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    вы в этот hash_map указатель на локальную переменную кладете?
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    _DEN_
    Спасибо! Куда пиво прислать? ))
     
  5. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    GoldFinch
    Да
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    steelfactor
    Указатель на локальную переменную складывать тоже неправильно - если мапа живет дольше, чем локальная переменная, то в мапе будет мусор. Пивом не беру, предпочитаю деньги. Но это не тот случай :)