Инвалидация итератора в std::map

252
20 апреля 2017, 17:37

Во многих источниках вроде http://www.amse.ru/courses/cpp1/2010.04.07.html ничего не сказано про инвалидацию итераторов в map.

Является ли опасным и UB код ниже?

std::map<Word32, OnlineUser*>::iterator toDelete, it = onlineUsers.begin();
while (it != onlineUsers.end())
    if (it->second) 
    {
        if (curUnixTimeStamp - it->second->lastActiveTime > MAX_NON_ACTIVETIME)
        {
            toDelete = it;
            it++;
            OnlineUser* userToDelete = toDelete->second;
            onlineUsers.erase(toDelete);
            delete userToDelete;
        } else {
            it++;
        }
    }

К сожалению, у меня gcc version 4.4.7? не поддерживающий ни лямбд, ни возвращающий итератор после erase, так что я не могу сделать так, как советуют на стековерфлоу вроде it = c.erase(it); Update: Пробовал использовать связку erase(remove_if), но у меня сложности с предикатом. Я не могу использовать лямбды из-за версии компилятора, а мой предикат требует использования локальной переменной. Пробовал создать обьект класса

    class Predicate{
public:
    Predicate(Word32 curUnixTimeStamp):_curUnixTimeStamp(curUnixTimeStamp){}
    bool operator()(std::pair<Word32, Sites::OnlineUser*> user){
        return _curUnixTimeStamp - (Word32)user.second->lastActiveTime > (Word32)MAX_NON_ACTIVETIME ;
    }
private:
    Word32 _curUnixTimeStamp;   
};

и использовать

class Predicate p(curUnixTimeStamp);
onlineUsers.erase(std::remove_if(onlineUsers.begin(), onlineUsers.end(),p));

но вываливается ворох ошибок

/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h: In member function std::pair<const unsigned int, Sites::OnlineUser*>& std::pair<const unsigned int, Sites::OnlineUser*>::operator=(const std::pair<const unsigned int, Sites::OnlineUser*>&)’:
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h:68:   instantiated from _FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = std::_Rb_tree_iterator<std::pair<const unsigned int, Sites::OnlineUser*> >, _Predicate = Sites::Predicate]’
sites.hpp:195:   instantiated from here
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h:68: error: non-static const member const unsigned int std::pair<const unsigned int, Sites::OnlineUser*>::first’, can't use default assignment operator
In file included from /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/algorithm:62,
                 from sites.hpp:13,
                 from banner.cpp:10:
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h: In function ‘_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = std::_Rb_tree_iterator<std::pair<const unsigned int, Sites::OnlineUser*> >, _Predicate = Sites::Predicate]’:
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:1161: note: synthesized method ‘std::pair<const unsigned int, Sites::OnlineUser*>& std::pair<const unsigned int, Sites::OnlineUser*>::operator=(const std::pair<const unsigned int, Sites::OnlineUser*>&)’ first required here 
gmake: *** [banner.o] Error 1
READ ALSO
Вызов С++ функции из Python

Вызов С++ функции из Python

Есть Python скрипт имеющий путь к файлу, необходимо открыть этот файл в С/С++ функции, провести с ним манипуляции и вернуть результат в Python скрипт

235
Зачем var app = app || {} в начале пишут?

Зачем var app = app || {} в начале пишут?

Зачем в начале скрипта пишут var app = app || {}; ? Ссылка на весь файл

247
Dropzone.js ошибка сервера

Dropzone.js ошибка сервера

Доброго веремени суток, возникла проблема с использование плагина, вот его настройка

291