是否可以简化迭代std映射的代码?

And*_*kle 0 mfc stdmap c++11

所以我有这个定义:

using HistoryDataItemList = list<CHistoryDataItem>;
HistoryDataItemList m_listHistoryItems;
Run Code Online (Sandbox Code Playgroud)

而这种方法:

bool CHistoryData::HasHistoryForAssignment(ASSIGN_TYPE_E eAssignType)
{
    bool bHasHistoryForAssignment = false;
    auto iter = m_listHistoryItems.begin();

    for (; iter != m_listHistoryItems.end(); iter++)
    {
        if (iter->GetAssignmentType() == eAssignType)
        {
            bHasHistoryForAssignment = true;
            break;
        }
    }

    return bHasHistoryForAssignment;
}
Run Code Online (Sandbox Code Playgroud)

我知道使用像C#这样的语言可以简化代码,但是在使用较新的C++ 11时,还可以使用MFC吗?或者我所写的内容非常简单?

谢谢.

Vit*_*meo 5

最明显的改进是使用C++ 11 "range- for"循环:

bool CHistoryData::HasHistoryForAssignment(ASSIGN_TYPE_E eAssignType)
{
    bool bHasHistoryForAssignment = false;

    for (auto& item : m_listHistoryItems)
    {
        if(item.GetAssignmentType() == eAssignType)
        {
            bHasHistoryForAssignment = true;
            break;
        }
    }

    return bHasHistoryForAssignment;
}
Run Code Online (Sandbox Code Playgroud)

但考虑到您的代码,您真正想要的是检查是否有任何项与特定谓词匹配.有一个<algorithm>!

bool CHistoryData::HasHistoryForAssignment(ASSIGN_TYPE_E eAssignType)
{
    return std::any_of(std::begin(m_listHistoryItems),
                       std::end(m_listHistoryItems),
                       [](const CHistoryDataItem& item) 
                       {
                           return item.GetAssignmentType() == eAssignType;
                       });
}
Run Code Online (Sandbox Code Playgroud)

或者,使用for没有额外状态的a也很容易阅读和理解:

bool CHistoryData::HasHistoryForAssignment(ASSIGN_TYPE_E eAssignType)
{
    for (auto& item : m_listHistoryItems)
    {
        if(item.GetAssignmentType() == eAssignType)
            return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)