
Tischlerg
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 unlesbarer Informationen und ich bin sehr neu in C und C++.
Wie kann ich ein Paar als Schlüssel in einer Karte verwenden? Und im Allgemeinen Wie kann ich jede Art von Struktur (Objekte, Strukturen usw.) als Schlüssel in einer Karte verwenden?
Vielen Dank!
std::map::insert
nimmt ein einziges Argument: das Schlüssel-Wert-Paar, also müssten Sie Folgendes verwenden:
mapa.insert(std::make_pair(p1, "Manzana"));
Du solltest benutzen std::string
anstelle von C-Saiten in Ihren Typen. So wie es jetzt ist, werden Sie wahrscheinlich nicht die erwarteten Ergebnisse erhalten, da das Nachschlagen von Werten in der Karte durch Vergleichen von Zeigern und nicht durch Vergleichen von Zeichenfolgen erfolgt.
Wenn Sie wirklich C-Saiten verwenden möchten (was Sie wiederum nicht sollten), müssen Sie verwenden const char*
anstatt char*
in deinen Typen.
Und im Allgemeinen Wie kann ich jede Art von Struktur (Objekte, Strukturen usw.) als Schlüssel in einer Karte verwenden?
Sie müssen überladen operator<
für den Schlüsseltyp oder verwenden Sie einen benutzerdefinierten Komparator.
Hier ist eine funktionierende Umschreibung 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;
}

Julian Declerq
Alternativ zu dem, was James McNellis sagte:
mapa.insert(std::make_pair(p1, "Manzana"));
Du könntest benutzen mapa.insert({p1, "Manzana"});

Kumar Utkarsh
Dies ist eine ähnliche Version dessen, was Sie tun möchten, ändern Sie einfach die Datentypen, das ist alles. Verwenden Sie außerdem einen C++-String, nicht den, den 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));
}
std::map::emplace ist dein Freund.
mapa.emplace(p1, "Manzana");

tragul
Dies wird genau das tun, was Sie wollen
#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;
}
10121700cookie-checkPaar als Schlüssel in einer Map verwenden (C++ / STL)yes
Bitte poste in Zukunft die erhaltenen Fehlermeldungen. Andernfalls kann es für die Menschen oft schwierig oder unmöglich sein, Ihnen zu helfen. 🙂
– James McNellis
18. Juli 2010 um 20:46 Uhr
Wenn Sie die Fehler posten, können wir sicher auch helfen, zu erklären, was sie bedeuten und wie Sie sie interpretieren können, wenn Sie sie in Zukunft sehen.
– James McNellis
18. Juli 2010 um 21:02 Uhr
Beachten Sie, dass bei Verwendung von Zeichenfolgenliteralen die Adressen der Saiten verglichen werden, nicht die Saiten selbst. Du solltest besser verwenden
std::string
.– sbi
18. Juli 2010 um 22:37 Uhr
Schauen Sie sich auch Warum kann ich eine unordered_map nicht mit einem Paar als Schlüssel kompilieren?
– y2k-shubham
3. September 2020 um 11:21 Uhr