Utiliser la paire comme clé dans une map (C++ / STL)

je veux utiliser une paire de STL comme clé d'une carte.

#include <iostream>
#include <map>

using namespace std;

int main() {

typedef pair<char*, int> Key;
typedef map< Key , char*> Mapa;

Key p1 ("Apple", 45);
Key p2 ("Berry", 20);

Mapa mapa;

mapa.insert(p1, "Manzana");
mapa.insert(p2, "Arandano");

return 0;

}

mais le compilateur jette un tas d'informations illisibles et je suis très nouveau en C et c++.

Comment puis-je utiliser une paire de clé dans une carte? Et en général, Comment puis-je utiliser n'importe quel type de structure (objets, structures, etc) comme clé dans une carte?

Merci!

29
demandé sur Soo Wei Tan 2010-07-19 00:38:37

4 réponses

std::map::insert prend un seul argument: la paire clé-valeur, donc vous devez utiliser:

mapa.insert(std::make_pair(p1, "Manzana"));

Vous devez utiliser std::string au lieu des chaînes C dans vos types. Comme il est maintenant, vous n'obtiendrez probablement pas les résultats que vous attendez parce que la recherche des valeurs dans la carte sera faite en comparant des pointeurs, pas en comparant des chaînes.

si vous voulez vraiment utiliser les chaînes C (ce que, encore une fois, vous ne devriez pas), alors vous devez utiliser const char* au lieu de char* dans votre type.

et en général Comment puis-je utiliser n'importe quel type de structure (objets, structures, etc) comme une clé dans une carte?

Vous avez besoin de surcharger operator< pour le type de clé ou utiliser un comparateur.

28
répondu James McNellis 2010-07-18 20:44:52

Voici une réécriture du code en question:

#include <map>
#include <string>

class Key
{
  public: 
    Key(std::string s, int i)
    {
      this->s = s;
      this->i = i;
    }
    std::string s;
    int i;
    bool operator<(const Key& k) const
    {
      int s_cmp = this->s.compare(k.s);
      if(s_cmp == 0)
      {
        return this->i < k.i;
      }
      return s_cmp < 0;
    }
};

int main()
{


  Key p1 ("Apple", 45);
  Key p2 ("Berry", 20);

  std::map<Key,std::string> mapa;

  mapa[p1] = "Manzana";
  mapa[p2] = "Arandano";

  printf("mapa[%s,%d] --> %s\n",
    p1.s.c_str(),p1.i,mapa.begin()->second.c_str());
  printf("mapa[%s,%d] --> %s\n",
    p2.s.c_str(),p2.i,(++mapa.begin())->second.c_str());

  return 0;
}
6
répondu Alec Jacobson 2011-01-11 14:40:24

alternativement à ce que James McNellis a déclaré:

mapa.insert(std::make_pair(p1, "Manzana"));

vous pouvez utiliser mapa.insert({p1, "Manzana"});

3
répondu Julian Declercq 2017-08-24 23:00:09

C'est la volonté de faire exactement ce que vous voulez

#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<pair<string, long long int>, string> MAP;
    pair<string, long long int> P;
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Apple", 45), "Manzana"));
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Berry", 20), "Arandano"));
    P = make_pair("Berry", 20);
    //to find berry, 20
    cout<<MAP[P]<<"\n";
    return 0;
}
0
répondu trahul 2018-03-10 18:34:11