- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似的问题here但是这个新问题的上下文不同。
我有这个变量:PublisherMap m_mapPublishers;
PublisherMap
的定义是:
using PublisherMap = std::map<CString, S_DEMO_ENTRY_EX>;
我有这个读取 map 并填充 CListBox
的方法:
bool CChristianLifeMinistryPersonalCopiesDlg::InitPublishersGrid()
{
try
{
m_lbPublishers.ResetContent();
for (auto & mapPublisher : m_mapPublishers)
{
bool bInclude = false;
if (m_iDisplayMode == DISPLAY_EVERYONE)
bInclude = true;
else if (m_iDisplayMode == DISPLAY_BROTHER && mapPublisher.second.eGender == GENDER_MALE)
bInclude = true;
else if (m_iDisplayMode == DISPLAY_SISTER && mapPublisher.second.eGender == GENDER_FEMALE)
bInclude = true;
if (bInclude && m_bLimitDisplay)
{
CString strTemp;
if (!m_mapSSAssignedPublishers.Lookup(mapPublisher.first, strTemp))
bInclude = FALSE;
}
if (bInclude)
{
int i = m_lbPublishers.AddString(mapPublisher.first);
m_lbPublishers.SetItemData(i, MAKEWPARAM(mapPublisher.second.eGender, mapPublisher.second.eAppointed));
}
}
}
catch (_com_error e)
{
LPCTSTR szError = e.ErrorMessage();
AfxMessageBox(szError);
return false;
}
catch (CException* e)
{
e->Delete();
AfxMessageBox(_T("CException"));
return false;
}
m_iSelectMode = SELECT_NONE;
UpdateData(FALSE);
return true;
}
请注意,我使用了项目数据:
m_lbPublishers.SetItemData(i,
MAKEWPARAM(mapPublisher.second.eGender, mapPublisher.second.eAppointed));
它工作得很好。如果我使用的是 CPtrArray
,我会为列表框中的每个条目分配实际的结构对象指针。
我不太了解 std::map
的机制。有什么安全的方法可以直接将 map (mapPublisher
) 中的每个条目与每个列表框条目相关联,以便我以后可以访问它?
我意识到我可以获取列表框条目的文本,然后在 map 中找到它并以这种方式获取它。但是否有更直接的方法将两者联系在一起呢?
最佳答案
std::map
被指定为从不移动现有元素的关联容器,参见 [associative.reqmts]/9 :
The
insert
andemplace
members shall not affect the validity of iterators and references to the container, and theerase
members shall invalidate only iterators and references to the erased elements.
在实践中,它通常被实现为红黑树。
所以保留指向现有元素的指针是安全的,只要它们的生命周期超过指针的生命周期。
请注意,如果您切换到 std::unordered_map
( HashMap ),您将失去该保证。
设置:
m_lbPublishers.SetItemDataPtr(i, &mapPublisher.second);
检索:
auto psEntry = (S_DEMO_ENTRY_EX*)m_lbPublishers.GetItemDataPtr(i);
CListBox::GetItemDataPtr()
返回 void*
因此需要强制转换。
关于c++ - 将 std::map 项设置为 CListBox 的项数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49529172/
如何计算 json feed 中的项目数量? 缩写的 json 格式... { "rlm1":[...], "rlm2":[...], "rlm3":[...], "r
我是一名优秀的程序员,十分优秀!