find_if可以用来在std::map/std::unordered_map中查找键吗?

问题描述 投票:0回答:1

这是一个简单的程序,包括将一个元素添加到

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
    是实施此计划的最佳方法,或者使用其他替代方案(例如
    []
    )效果更好。 (?)

非常感谢

c++ lambda find unordered-map stdmap
1个回答
0
投票

由于名称是您的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));
}

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.