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

时间:2017-07-07 08:59:32

标签: c++11 mfc stdmap

所以我有这个定义:

using HistoryDataItemList = list<CHistoryDataItem>;
HistoryDataItemList m_listHistoryItems;

这个方法:

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;
}

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

谢谢。

1 个答案:

答案 0 :(得分:5)

最明显的改进是使用C ++ 11 &#34;范围 - for&#34; 循环:

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

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

    return bHasHistoryForAssignment;
}

但考虑到您的代码,您真正想要的是检查任何项是否与特定谓词匹配。 There's an <algorithm> for that!

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;
                       });
}

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

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

    return false;
}