Search code examples
visual-c++stdmapemplace

Building a std::map and issue with using std::emplace


Code:

std::map<CString, S_DISCUSSION_HIST_ITEM> mapHistory;
// History list is in ascending date order
for (auto& sHistItem : m_listDiscussionItemHist)
{
    if (m_bFullHistoryMode)
        mapHistory.emplace(sHistItem.strName, sHistItem);
    else if (sHistItem.eSchool == m_eActiveSchool)
        mapHistory.emplace(sHistItem.strName, sHistItem);
}
// The map is sorted by Name (so reset by date later)
// The map has the latest assignment info for each Name now

Observation:

I now understand that std::emplace behaves like this:

The insertion only takes place if no other element in the container has a key equivalent to the one being emplaced (keys in a map container are unique).

Therefore my code is flawed. What I was hoping to acheive (in pseudo code) is:

For Each History Item
   Is the name in the map?
      No, so add to map with sHitItem
      Yes, so replace the sHistItem with this one
End Loop

By the end of this loop iteration I want to have the most recent sHitItem, for each person. But as it is, it is only adding an entry into the map if the name does not exist.

What is the simplest way to get around this?


Solution

  • Use insert_or_assign method if the item is assignable. It will be assigned if it already exists. Or use [] operator followed by assignment, it will default-construct item if it does not exist.

    For non-assignable types I'm afraid there's no convenient way.