【问题标题】:Search for key by vector in map在地图中按向量搜索键
【发布时间】:2017-11-14 13:56:47
【问题描述】:

因此,我们有一个学校项目来创建电话簿,您应该可以在其中通过搜索姓名来查找电话号码。我决定使用带有字符串的电话号码和名称的字符串向量的地图,因为关联的号码应该能够在其中包含多个名称。

但是,由于我们直接从 Python 跳到 C++,没有任何语法或语言解释,我很难想出一种通过搜索名称来查找数字的方法。

我使用的类是这样的

class Telefonbok
{
    public:
        void add(string namn, string nummer)
        {
            map<string, vector<string>>::iterator it = boken.find(nummer);
            if (it != boken.end())
            {
                cout << "This number already exists, please choose another";
            }
            else
            {
                namn_alias.push_back(namn);
                boken[nummer] = namn_alias;
            }
        }
        void lookup(string name)
        {
            for (map<string, vector<string>>::iterator sokning = boken.begin(); sokning != boken.end(); sokning++)
                cout << "Hello!";
        }
    private:
        vector<string> namn_alias;
        string nummer;
        map<string, vector<string>> boken;
};

我在查找函数中尝试做的是通过向量中的名称搜索电话号码,但我对如何继续在 for 循环内查看向量感到困惑。

计划是逐个遍历 Map 键以找到包含搜索名称的向量。关于如何继续的任何提示或我错过的一些可用于此的功能?

【问题讨论】:

  • "但是,由于我们直接从 Python 跳转到 C++,没有任何语法或语言的解释" 那么,请考虑阅读 good C++ book
  • 您不需要从名称到数字的其他方式映射吗?
  • 你的 add 方法不对:你可能只需要boken[nummer].push_back(namn);
  • 您可能也不想让namn_aliasnummer 成为Telefonbok 的成员。 namn_alias 应该是 add 中 else 分支的本地,或者 @Jarod42 建议不存在。 成员 nummeradd 中的参数nummer 隐藏,并且没有在其他地方使用

标签: c++ dictionary vector visual-studio-2015


【解决方案1】:

Algirdas 是正确的,你应该阅读 C++。

假设您将名称映射到 1 个或多个数字,但每个名称只有 1 个数字...

#include <cstddef>
#include <iostream>
#include <map>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;

class Telefonbok
{
public:
  void add(string namn, string nummer) {
    auto it = nummer_namn.find(nummer);
    if (it != nummer_namn.end()) {
      cout << "This number already exists, please choose another" << endl;
    }
    else {
      nummer_namn[nummer] = namn;
      namn_nummer[namn].push_back(nummer);
    }
  }

  void lookup(string name) {
    auto it = namn_nummer.find(name);
    if (it == namn_nummer.end()) {
      cout << "Unable to find any numbers for " << name << ", sorry." << endl;
      return;
    }

    for (auto const& sokning : it->second)
      cout << name << " : " << sokning << endl;
  }
private:
  map<string, vector<string>> namn_nummer;
  map<string, string> nummer_namn;
};

int main() {
  Telefonbok bok;
  bok.add("Eljay", "789");
  bok.add("Eljay", "456");
  bok.add("Beaker", "123");

  bok.lookup("Eljay");
  bok.lookup("Beaker");
  bok.lookup("Bunsen Honeydew");

  return EXIT_SUCCESS;
}

【讨论】:

  • 谢谢。但是,主要问题是每个数字应该有多个名称的可能性。我希望我有时间阅读 c++,但我们必须在不到两周的时间内将我们在 python 中所做的一切(大约 3 个月的工作)转录到 c++ 中。这是最后一个,但只剩下三天了。
  • 我的例子支持每个名字有多个数字。修改每个数字以具有多个名称应该不会太难。我认为 StackOverflow 通常不赞成为家庭作业问题提供明确的答案……但是由于您提供了几乎完整的代码 sn-p 并且在 C++ 语法方面遇到了可以理解的困难,我希望我的代码示例能帮助您解决问题。 (我认为 Python 是一种比 C++ 更友好/更温和的语言来学习概念。)
  • 啊,我明白了。我会进一步研究它,希望能更好地理解它。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2014-07-19
  • 2016-02-16
相关资源
最近更新 更多