C++ 在映射期间访问给定键处的元素

C++ 在映射期间访问给定键处的元素,c++,C++,我已经使用下面的代码在string和类类型Person之间建立了映射 std::map<std::string, Person*> person_list; // while... Person* person = University::addInput(person_type, person_name); //person_type: EMPLOYEE, ALUMNI, STUDENT person_list[person_name] = person; std::映射人员列表

我已经使用下面的代码在
string
和类类型
Person
之间建立了映射

std::map<std::string, Person*> person_list;
// while...
Person* person = University::addInput(person_type, person_name); //person_type: EMPLOYEE, ALUMNI, STUDENT
person_list[person_name] = person;
std::映射人员列表;
//而。。。
Person*Person=University::addInput(Person\u type,Person\u name)//人员类型:员工、校友、学生
人员列表[人员姓名]=人员;
问题:如果
人员类型
校友
,那么它应该与另一个类型为
学生
的人员连接,该人员的姓名以前已经映射过。现在,我想把这两个人联系起来

我正在试图找到
学生名
(这是此映射方案中的一个键),但不了解正确的方法


PS:为了消除不必要的混淆,我删除了
find()
问题。我真正的任务是找到给定关键点处的映射对象。所以,我认为find()可以帮助我。但是如果有其他的方法,请告诉我你真正想写的是这样的:
if(person\u list.find(“Tim”)==person\u list.end())
find
返回无法隐式转换为
bool
的interator

 if(person_list.find("Tim")) // == node_list.end()

上面的行不正确。find的结果是一个迭代器。该错误告诉您它无法隐式地将迭代器转换为bool。您需要将其与映射的结束迭代器进行比较。当然,这样做之后你会得到cout,因为很明显地图上没有一个叫Tim的人

有两种方法可以实现您的目标:

  • 在地图中查找
    “Tim”
    。如果找到,将其输出到
    cout

    std::map<std::string, char>::iterator found = person_list.find("Tim");
    if ( found != person_list.end() )
    {
       std::cout << found->second << std::endl;
    }
    

  • 您可以使用
    map.at()
    的内置边界检查:

    try{
        Person* tim = person_list.at("Tim");
        /* do stuff with tim */
    }
    catch(const std::out_of_range& e){
        std::cout << "Tim not found!" << std::endl;
    }
    
    试试看{
    Person*tim=在(“tim”)的Person_list.at;
    /*和蒂姆一起做事*/
    }
    捕获(常数标准::超出范围和e){
    
    std::cout-Um…错误消息似乎表明错误实际上不在那一行。请让您的问题变得独立。@Cubic:好的,我已经给出了我的问题的简短版本。请看一看。
    cout@RSahu:名称位于哪个位置present@RSahu当前位置实际上,我真正的任务是在给定的键处找到映射对象
    可以帮助我。但是如果有其他方法……请建议我好吧,我已经更新了我的问题。实际上,通过给出名字,我需要找到那个名字的
    人*
    。这只是一个例子。你的更新做得不太好,因为现在你正试图将迭代器流到cout,这毫无意义。你第一次使用find是正确的。你为什么要为第二个这么费劲呢?看起来你需要根据键进行查找,如果找到了,请检查person对象中的其他内容以查看person类型。但是,你的示例中没有定义person类型。实际上,我真正的任务是在给定键处查找映射对象。因此,我认为d()可以帮助我。但是如果有其他方法..请建议我基于这个问题find确实可以帮助你。你的示例和问题太模糊了。首先,你没有显示person对象的定义。示例是在映射中放置未初始化的指针。键是“node1”和“node2”这些不是名字,所以我不知道你想做什么。这个答案不再匹配中的代码question@shawn1874:谢谢,我对
    (person\u list.find(“Tim”)
    的用法感到困惑,您的回答消除了我的困惑,但我的实际要求不同,我已经接受了答案。如果“Tim”如果地图上没有“Tim”,那么你就只能打印一个未初始化的指针了,对吗?我不确定这会有什么效果。@shawn1874,如果地图上没有“Tim”,那么,
    person[“Tim”]
    返回空字符串。错误。地图由字符串和指针组成。std::map person_list;found->second是person*或至少现在是,除非问题再次更改。运算符[]for map返回对pair元素第二部分的引用,即person*尽管如此,考虑到问题的性质,您的答案是正确的。@shawn1874出于某种原因,我认为OP中的map是
    map
    。我是幻觉还是OP发生了巨大的变化?
    try{
        Person* tim = person_list.at("Tim");
        /* do stuff with tim */
    }
    catch(const std::out_of_range& e){
        std::cout << "Tim not found!" << std::endl;
    }