Ich möchte ein Paar aus STL als Schlüssel einer Karte verwenden.
#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;
}
Aber der Compiler wirft eine Menge unleserlicher Informationen ab und ich bin in C und C++ noch sehr neu.
Wie kann ich ein Paar als Schlüssel in einer Karte verwenden? Und im Allgemeinen Wie kann ich eine beliebige Struktur (Objekte, Strukturen usw.) als Schlüssel in einer Karte verwenden?
Vielen Dank!
std::map::insert
akzeptiert ein einziges Argument: das Schlüssel-Wert-Paar. Sie müssen also Folgendes verwenden:
mapa.insert(std::make_pair(p1, "Manzana"));
Sie sollten std::string
anstelle von C-Zeichenfolgen in Ihren Typen verwenden. So wie es jetzt ist, werden Sie wahrscheinlich nicht die erwarteten Ergebnisse erhalten, da das Nachschlagen von Werten in der Karte durch einen Vergleich von Zeigern und nicht durch einen Vergleich von Zeichenfolgen erfolgt.
Wenn Sie wirklich C-Strings verwenden möchten (was Sie wiederum nicht tun sollten), müssen Sie const char*
anstelle von char*
in Ihren Typen verwenden.
Und im Allgemeinen Wie kann ich eine beliebige Struktur (Objekte, Strukturen usw.) als Schlüssel in einer Karte verwenden?
Sie müssen operator<
für den Schlüsseltyp überladen oder einen benutzerdefinierten Vergleicher verwenden.
Hier ist eine funktionierende Umarbeitung des betreffenden Codes:
#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;
}
Alternativ zu den Aussagen von James McNellis:
mapa.insert(std::make_pair(p1, "Manzana"));
sie könnten mapa.insert({p1, "Manzana"});
verwenden
Dies ist eine ähnliche Version von dem, was Sie tun möchten, ändern Sie einfach die Datentypen, das ist alles. Verwenden Sie auch eine c ++ - Zeichenfolge, nicht die, die wir in c verwenden.
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
typedef pair<ll,ll> my_key_type;
typedef map<my_key_type,ll> my_map_type;
int main()
{
my_map_type m;
m.insert(make_pair(my_key_type(30,40),6));
}