0

私は単純な電話帳を持っていますが、姓のリストを検索して同じ姓を持つ名を返すように変更したいと考えています。複数の人(家族のメンバー)。一般に、電話番号には数字以外の文字を含めることができます。たとえば、以下のような名前のリストがある場合

john williams
smart williams
hendrix james
drey williams

williams と入力するか、williams を検索すると、返されるはずです

john williams
smart willams
drey williams

使いたいMap<String,List<String>>.

class name {
  string str;
public:
  name() { 
      str = ""; 
  }
  name(string s) { 
      str = s; 
  }
  string get() { 
      return str; 
  }
};

// Define less than relative to name objects.
bool operator<(name a, name b){
   return a.get() < b.get();
}

class surname {
  string str;
public:
  surname() { 
      str = ""; 
  }
  surname(string s) { 
      str = s; 
  }
  string get() { 
      return str; 
  }
};

int main()
{
  map<name, surname> directory;

  directory.insert(pair<name, surname>(name("James"), surname("williams")));
  directory.insert(pair<name, surname>(name("Coz"), surname("williams")));
  directory.insert(pair<name, surname>(name("James"),  surname("trues")));
  directory.insert(pair<name, surname>(name("Tni"),surname("mutton")));

  // given a name, find number
  string str;
  cout << "Enter name: ";
  cin >> str;

  map<name, surname>::iterator p;

  p = directory.find(name(str));
  if(p != directory.end()) 
    cout << "surname: " <<  p->second.get();
  else
    cout << "Name not in directory.\n";
    system("pause");

  return 0;
}

前もって感謝します

4

1 に答える 1

1

マップはキーと値のペアのコンテナーです。つまり、キーと値を定義する必要があります。この特定のケースでは、姓をキーとして、その姓に関連する名前のリストを価値。既にお気づきのように、ベクトルが値であるベクトルのマップを使用してそれを実現できます。

std::map<std::string, std::vector <std::string> > directory;

これは、あなたが達成したいことの実例です (名前と姓の構造体を使用する意味がわからないので、文字列の名前と姓の構造体を置き換えましたが、必要に応じて元に戻すことができます)

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

int main()
{
    std::map<std::string, std::vector <std::string> > directory;

    directory["williams"].push_back("James");
    directory["williams"].push_back("Coz");
    directory["trues"].push_back("James");
    directory["mutton"].push_back("Tni");

    // given a name, find number
    std::string str;
    std::cout << "Enter surname: ";
    std::cin >> str;

    std::map<std::string, std::vector <std::string> >::iterator p;

    p = directory.find(str);
    if(p != directory.end())
    {
      std::string key = p->first;
      std::vector<std::string> names = p->second;

      for (int i = 0; i < names.size(); ++i)
         std::cout << key << " " << names[i] << std::endl;

    }
    else
    {
        std::cout << "Name not in directory.\n";
    }


    return 0;
}

入力 williams の場合、次のように出力されます。

Enter surname: williams
williams James
williams Coz

「ウィリアムズ」にさらに名前を追加するには、そのベクトルに名前をプッシュバックし続ける必要があります。

    directory["williams"].push_back("Luis");
    directory["williams"].push_back("Pedro");
    directory["williams"].push_back("Juan");

それが役に立てば幸い。

于 2012-12-24T20:49:09.310 に答える