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



所以我有这个定义:

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 完成吗?还是我写的东西尽可能简单?

谢谢。

最明显的改进是使用 C++11"范围-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;
}

但是考虑你的代码,你真正想要的是检查是否有任何项目与特定的谓词匹配。这是有<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;
});
}

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

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

最新更新