Untitled
unknown
plain_text
2 years ago
2.3 kB
8
Indexable
void assign( K const& keyBegin, K const& keyEnd, V const& val ) { // body of assign() function if (!(keyBegin < keyEnd)) return; std::pair<K,V> beginExtra; std::pair<K,V> endExtra; bool beginHasExtra = false; bool endHasExtra = false; // open range for iterator typename std::map<K,V>::iterator itBegin; itBegin = m_map.lower_bound(keyBegin); if ( itBegin!=m_map.end() && keyBegin < itBegin->first ) { if (itBegin != m_map.begin()) { beginHasExtra = true; --itBegin; beginExtra = std::make_pair(itBegin->first, itBegin->second); } } // close range for iterator typename std::map<K,V>::iterator itEnd; itEnd = m_map.lower_bound(keyEnd); if ( itEnd!=m_map.end() && keyEnd < itEnd->first ) { endHasExtra = true; typename std::map<K,V>::iterator extraIt = itEnd; --extraIt; endExtra = std::make_pair(keyEnd, extraIt->second); } // four canonical conflicts bool insertMid = true; if (beginHasExtra) { if (beginExtra.second == val) insertMid = false; } else { if (itBegin != m_map.begin()) { typename std::map<K,V>::iterator beforeMid = itBegin; --beforeMid; if (beforeMid->second == val) insertMid = false; } } if (endHasExtra) { if ( (insertMid && endExtra.second == val) || (!insertMid && endExtra.second == beginExtra.second) ) endHasExtra = false; } else { if ( (insertMid && itEnd!=m_map.end() && itEnd->second == val) || (!insertMid && itEnd!=m_map.end() && itEnd->second == beginExtra.second) ) itEnd = m_map.erase(itEnd); } itBegin = m_map.erase(itBegin, itEnd); if (beginHasExtra) itBegin = m_map.insert(itBegin, beginExtra); if (insertMid) itBegin = m_map.insert(itBegin, std::make_pair(keyBegin, val)); if (endHasExtra) m_map.insert(itBegin, endExtra); }
Editor is loading...
Leave a Comment