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!
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.
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;
}
alternativement à ce que James McNellis a déclaré:
mapa.insert(std::make_pair(p1, "Manzana"));
vous pouvez utiliser mapa.insert({p1, "Manzana"});
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;
}