构建 std::map 并使用 std::emplace 问题
Building a std::map and issue with using std::emplace
代码:
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
观察:
我现在明白 std::emplace
的行为是这样的:
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).
因此我的代码有缺陷。我希望实现的(伪代码)是:
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
在此循环迭代结束时,我想为每个人提供最新的 sHitItem,
。但事实上,如果名称不存在,它只会在映射中添加一个条目。
解决这个问题的最简单方法是什么?
如果项目是可分配的,请使用 insert_or_assign
方法。如果它已经存在,它将被分配。或者使用[]
运算符后跟赋值,如果item不存在则默认构造
对于不可赋值的类型,恐怕没有方便的方法。
代码:
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
观察:
我现在明白 std::emplace
的行为是这样的:
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).
因此我的代码有缺陷。我希望实现的(伪代码)是:
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
在此循环迭代结束时,我想为每个人提供最新的 sHitItem,
。但事实上,如果名称不存在,它只会在映射中添加一个条目。
解决这个问题的最简单方法是什么?
如果项目是可分配的,请使用 insert_or_assign
方法。如果它已经存在,它将被分配。或者使用[]
运算符后跟赋值,如果item不存在则默认构造
对于不可赋值的类型,恐怕没有方便的方法。