【问题标题】:How to search a map in C++如何在 C++ 中搜索地图
【发布时间】:2017-07-17 13:44:26
【问题描述】:

this example 是我最了解如何在 C++ 中搜索地图的方法,我仍然需要帮助。

我为电话簿创建了地图。

map<string,int> PhBook;

现在我让用户为其添加姓名和电话。

getline(cin >> ws,name);
cin >> phone;
PhBook[name] = phone;

我还想做的是让用户在地图中搜索可能的名称并相应地打印“电话 = ....”或“未找到”消息。

那么我该怎么做呢?因为我是新手,所以我想要最简单的解决方案。我的困难在于我不知道如何使用元素(人名)搜索地图。

【问题讨论】:

  • 打开你的 C++ 书籍到地图章节。我相信您的书解释了如何使用地图的 find() 方法。
  • 你可以使用std::map&lt;string,int&gt;::const_iterator result = PhBook.find(input); If (result == PhBook.end() ) " cout &lt;&lt;" name not found "&lt;&lt;endl; else cout&lt;&lt;" phone "&lt;&lt;result-&gt;second&lt;&lt;std::endl;
  • cppreference 示例准确地向您展示了如何按照您的要求进行操作。您不了解其中的哪一部分,或者它没有做您真正想做的事情?
  • 从 cpp 参考和 Masums 解决方案中,我了解了迭代器及其“指针功能”,但我想我需要更多关于“second”和“PhBook”的解释.end()" 命令可以。
  • 它不会打印任何东西,但我也没有收到错误消息。我没有代码示例可以给你,因为它是一个非常简单的示例,我只是在测试一些东西。

标签: c++ dictionary search find


【解决方案1】:

简单的方法是:

if (PhBook[name] != 0)
    cout<<"The phone is: "<<PhBook[name]<<endl;
else
    cout<<"Not found”<<endl;

【讨论】:

    【解决方案2】:

    这里的map如果找到则返回一个迭代器到it,否则it返回一个迭代器到map::end

    map<string,int> ::iterator it;
    it = PhBook.find(name);
    
    if (it != PhBook.end()){  
      cout<<"The phone = "<<it->second<<endl;
    }else{
      cout<<"Not found"<<endl;
    }
    

    【讨论】:

      【解决方案3】:

      您可以通过多种方式在 STL(标准模板库)映射中找到键。您可以使用 STL 库已经提供的方法,也可以使用自己的方法来完成相同的任务。我将尝试提供一些技巧来帮助您简化解决方案。

      1-)正如上一篇文章已经提到的,您可以定义一个 std::Map 的迭代器,并将 find 函数的结果分配给一个已经定义的迭代器。但是,有时声明迭代器可能会变得混乱。例如,如果你碰巧定义了一个嵌套的地图对象

      std::map<std::string, std::map<std::string, int>> dict;
      dict["name"]["phone"] = 1234;
      

      在这种情况下,当您想要定义上述类型的迭代器时,您必须声明,

      std::map<std::string, std::map<std::string, int>>::iterator it = dict.begin();
      

      为了能够声明一个迭代器而花费这么多精力是疯狂且耗时的。幸运的是,C++11 带有 auto 关键字,可以在编译时自动推断类型。这是我发现 auto 关键字最有用的唯一地方。使用 auto 关键字,

      auto it = dict.begin(); /*or*/ auto it = dict.find(name)
      

      就是你所需要的。

      2-)当指针用于一维连续数据类型(如数组)时,迭代器会给您一种指针错觉。但是,STL 容器可能不会在内存上连续分布数据(链表、二叉树是典型示例),而是可以遍布堆和堆栈。给出指针算术的错觉并使用迭代器是有用的抽象。 C++11 中基于范围的循环可以很好地替代迭代器。

      std::map<std::string, int> dict;
      for(auto & kv : dict){ /* Program logic goes here */ }
      

      在这种情况下,kv 将包含键值对并且是 std::pair 的类型。

      3-)您可以使用 std::Map 的count 方法检查映射中是否存在键。 countfind 之间的区别在于 count 返回一个数值,而 find 返回一个迭代器。

      【讨论】:

      • 我接近理解了。我没有得到的是 map.find(name)->second。那东西打印出我需要的密钥的值。关于您解决方案的第 (3) 部分,PhBook.count(name) 提供了一个整数,对吗?我发现人们也使用它作为布尔值的例子。我的代码中有一些问题,我会在修复后立即更新并选择最佳答案。
      • count方法std::Map的返回值为size_t。 size_t 是无符号值的别名,它能够以大小表示对象(对象不一定必须是 C++ 对象,任何存储在内存中并可通过变量访问的东西都称为对象)。检查此resource 以了解有关 size_t 的更多信息。 Bool 类型可以认为是另一种只接收 1 和 0 值的整数类型。任何大于或小于 0 的都转换为 1,因此对应于 true。
      猜你喜欢
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      相关资源
      最近更新 更多