web-dev-qa-db-de.com

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

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!

29
ccarpenterg

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.

28
James McNellis

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;
}
6
Alec Jacobson

Alternativ zu den Aussagen von James McNellis: 

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

sie könnten mapa.insert({p1, "Manzana"}); verwenden

4
Julian Declercq

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));
}   
0
Kumar Utkarsh