inline void BaseGeneticAlgorithm<FITNESS_TYPE>::registerObserver(const std::shared_ptr<AlgorithmObserver<FITNESS_TYPE>> &observer) { typedef std::set<typename AlgorithmObserver<FITNESS_TYPE>::ObserveableEvent> setType; const setType events = observer->getSubscribedEvents(); for (const auto &it :events) { typename observers_map::iterator lb = _observers.lower_bound(it); if (lb != _observers.end() && !(_observers.key_comp()(it, lb->first))) { // key already exists // update lb->second if you care to lb->second.emplace_back(observer); } else { // the key does not exist in the map // add it to the map typename std::vector<std::shared_ptr<AlgorithmObserver<FITNESS_TYPE>>> list; list.emplace_back(observer); _observers.insert(lb, typename observers_map::value_type(it, list)); // Use lb as a hint to insert, } } }