gpt4 book ai didi

c++ - 将 std::map 项设置为 CListBox 的项数据

转载 作者:行者123 更新时间:2023-11-30 00:44:16 26 4
gpt4 key购买 nike

我有一个类似的问题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 and emplace members shall not affect the validity of iterators and references to the container, and the erase 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com