Paar als Schlüssel in einer Map verwenden (C++ / STL)

Lesezeit: 5 Minuten

Benutzer-Avatar
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!

  • 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

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.

  • mapa[p1] = "Manzana"; ist noch kürzer

    – Peter g.

    18. Juli 2010 um 21:13 Uhr


  • @Peter: operator[] hat eine andere Semantik, und ich würde davon abraten, sie zum Einfügen von Objekten in a zu verwenden map (Es fügt ein neues Objekt ein, falls noch keines vorhanden ist, und überschreibt dann sofort das neu erstellte temporäre Objekt).

    – James McNellis

    18. Juli 2010 um 21:18 Uhr

  • Wow, das war ein hässlicher Fehler, ich habe vergessen, das Paar zu machen. Es tut mir Leid! Nun, es funktioniert jetzt, aber es hat nicht funktioniert, als ich char* anstelle von const char* verwendet habe. Was hat es in diesem Fall mit const char* vs char* auf sich? Vielen Dank!

    – Tischlerg

    18. Juli 2010 um 21:20 Uhr


  • @ccarpenterg: Du musst dich nicht bei mir entschuldigen. 🙂 Die Zeichenfolgenliterale haben einen Typ const char[]hat der Paartyp ein Mitglied des Typs char*; Der Paarkonstruktor kann das const-Qualifikationsmerkmal nicht entfernen. Das gesagt; wirklich: verwenden std::stringist die Verwendung eines Zeigers als Kartenschlüssel fast immer eine schlechte Idee.

    – James McNellis

    18. Juli 2010 um 21:23 Uhr

  • @JamesMcNellis können Sie dies auf modernes C++ aktualisieren? Ich hatte mich gefragt, dass meine std::map funktionierte ohne Probleme mit a std::pair bis mir das aufgefallen ist seit C++14 hat es operator< definiert.

    – andree

    24. Mai 2019 um 13:30 Uhr


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;
}

  • Wieso den? Wie ist das besser als das, was das OP hatte? pair?

    – Benutzer102008

    15. Oktober 2011 um 1:11 Uhr

  • Ähm, weil es richtig kompiliert und ausgeführt wird?

    – Alec Jacobson

    15. November 2012 um 14:07 Uhr

  • das operator < vielleicht nicht so genau wie std::pairs.

    – Jichao

    12. September 2015 um 7:32 Uhr

  • @Jichao diese Antwort wurde vor C++14 geschrieben. operator < zum std::pair existiert erst seit C++14.

    – andree

    24. Mai 2019 um 13:29 Uhr

Benutzer-Avatar
Julian Declerq

Alternativ zu dem, was James McNellis sagte:

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

Du könntest benutzen mapa.insert({p1, "Manzana"});

  • @ccarpenterg: Das sollte die bevorzugte und akzeptierte Antwort von C++14 sein!

    – andree

    24. Mai 2019 um 13:28 Uhr

Benutzer-Avatar
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");

Benutzer-Avatar
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;
}

1012170cookie-checkPaar als Schlüssel in einer Map verwenden (C++ / STL)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy