C++ 如何在std::map中找到至少有一个数据成员等于键的结构元素

C++ 如何在std::map中找到至少有一个数据成员等于键的结构元素,c++,struct,stdmap,C++,Struct,Stdmap,我有一个问题,关于如何找到对应的元素,该元素至少有一个数据编号等于在带有结构的std::map中搜索的键 例如,假设我要在电话簿中找到一个姓名为或id的人的电话号码(假设没有一个姓名被多人使用),我将声明一个名为Person的struct,并定义一个std::map,其中包含Person对象和他/她的电话号码(在std::string中): struct-Person{ std::字符串名; std::字符串id; }; 地图电话簿; 当我从互联网上搜索时,我知道结构需要重载==,std::m

我有一个问题,关于如何找到对应的元素,该元素至少有一个数据编号等于在带有结构的
std::map
中搜索的键

例如,假设我要在电话簿中找到一个姓名为id的人的电话号码(假设没有一个姓名被多人使用),我将声明一个名为
Person
struct
,并定义一个
std::map
,其中包含
Person
对象和他/她的电话号码(在
std::string
中):

struct-Person{
std::字符串名;
std::字符串id;
};
地图电话簿;

当我从互联网上搜索时,我知道结构需要重载
==
std::map
仅根据
操作符进行定义,正如@Max Langhof指出的,当映射按键排序时,只能使用
find()
在映射中搜索键。要使用value(在您的例子中是name)进行搜索,您可以使用简单的遍历所有键。尽管这种方法效率不高,因为您必须搜索地图中的每条记录

for (auto it = phonebook.begin(); it != phonebook.end(); it++)
{
    if (it->second == "001")
    {
        return it->first;
    }     
}

// If you reach here, then value was not found
std::cout << "Cannot find the phone number for 001" << std::endl;
for(自动it=phonebook.begin();it!=phonebook.end();it++)
{
如果(它->秒==“001”)
{
返回->第一个;
}     
}
//如果到达此处,则未找到值

std::cout与合适的(或其他函子)一起使用?使用两个映射,每个键对应一个。感谢您的回答,我个人认为,如果我遍历容器进行搜索,我认为
std::vector
可能是更好的选择。:-)@杨汉林:我同意向量在这种情况下是好的,因为我们无论如何都要遍历所有节点(在最坏的情况下)。但这样一来,您将失去按键查找值的优势。因为在您的情况下,您需要同时按键和值进行搜索,所以至少使用map会更好(至少可以在O(logn)时间复杂度中搜索一个参数)。
for (auto it = phonebook.begin(); it != phonebook.end(); it++)
{
    if (it->second == "001")
    {
        return it->first;
    }     
}

// If you reach here, then value was not found
std::cout << "Cannot find the phone number for 001" << std::endl;