Usar par como clave en un mapa (C++ / STL)


Quiero usar un par de STL, como clave de un mapa.

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

}

Pero el compilador arroja un montón de información ilegible y soy muy nuevo en C y C++.

¿Cómo puedo usar un par como clave en un mapa? Y en general, ¿cómo puedo utilizar cualquier tipo de estructura (objetos, estructuras, etc.) como clave en un mapa?

Gracias!

Author: Soo Wei Tan, 2010-07-19

4 answers

std::map::insert toma un solo argumento: el par clave-valor, por lo que necesitaría usar:

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

Debes usar std::string en lugar de cadenas C en tus tipos. Como está ahora, es probable que no obtenga los resultados que espera porque la búsqueda de valores en el mapa se realizará comparando punteros, no comparando cadenas.

Si realmente quieres usar cadenas C (que, de nuevo, no deberías), entonces necesitas usar const char* en lugar de char* en tus tipos.

Y en general Cómo ¿puedo usar cualquier tipo de estructura (objetos, estructuras, etc.) como clave en un mapa?

Debe sobrecargar operator< para el tipo de clave o usar un comparador personalizado.

 28
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 20:44:52

Aquí hay una reescritura de trabajo del código en cuestión:

#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
Author: Alec Jacobson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 14:40:24

Alternativamente a lo que James McNellis declaró:

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

Podrías usar mapa.insert({p1, "Manzana"});

 3
Author: Julian Declercq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-24 23:00:09

Esto es hará exactamente lo que quieres

#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;
}
 0
Author: trahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-10 18:34:11