这是一个简单的程序,包括将一个元素添加到
std::unordered_map
中。但在添加之前,首先检查key是否已经存在,如果存在则不要添加。
我的问题是,由于
find_if
只需要在 lambda 函数中传递一个参数,因此我在实现这一点时遇到了麻烦,因为 std::unordered_map
上的元素是一对两种类型。我想知道是否可以使用 find_if
,如果不能,实现此目的的最佳方法是什么?
#include <iostream>
#include <unordered_map>
std::unordered_map <std::string_view, int> myDictionary{};
void addEmployee(std::string_view newName, int newTime)
{
// first check if they name already exists, if it does then do nothing and return
auto it{std::find_if(myDictionary.begin(), myDictionary.end(),
[&newName]( ??? )
{
return newName == myDictionary.first;
})};
if (it != myDictionary.end() )
{
std::cout << "Name already exists! Wasn't added.\n";
return;
}
// add employee into the map
myDictionary.insert(std::pair<std::string_view,int> (newName, newTime) );
}
void printDict( std::unordered_map<std::string_view, int>& myDict)
{
for (auto const& a: myDict)
std::cout << a.first << " " << a.second << "\n";
}
int main()
{
addEmployee("Daniel", 14);
addEmployee("Marco", 433);
addEmployee("Daniel", 500); //Should not add it, since key already exists
addEmployee("Alan", 125);
printDict(myDictionary);
return 0;
}
到目前为止我的研究,并提出了我仍在试图弄清楚的问题:
std::unordered_map
只添加uniques键,直接插入的话是不会添加的,所以之前不需要检查(?)std::unordered_map
的文档,我只发现find
作为成员函数,而不是find_if
,所以我假设这就是它不能使用的原因。如果没有,那么 find
是实施此计划的最佳方法,或者使用其他替代方案(例如 []
)效果更好。 (?)非常感谢
由于名称是您的unordered_map
中的
key,因此您可以简单地使用
unordered_map::find
方法来检查它是否存在:
void addEmployee(std::string_view newName, int newTime)
{
// first check if they name already exists, if it does then do nothing and return
auto it = myDictionary.find(newName);
if (it != myDictionary.end())
{
std::cout << "Name already exists! Wasn't added.\n";
return;
}
// add employee into the map
myDictionary.insert(std::pair<std::string_view, int>(newName, newTime));
}