2010-07-18 21 views
27

Quiero usar un par de STL como clave de un mapa.Usar el par como clave en un mapa (C++/STL)

#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 tirar un montón de información ilegible y yo soy muy nuevo en C y C++.

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

Gracias!

+7

En el futuro, publica los mensajes de error que recibe. De lo contrario, a menudo puede ser difícil o imposible que las personas lo ayuden. :) –

+2

Si publica los errores, estoy seguro de que también podríamos ayudar a explicar lo que significan y cómo puede interpretarlos cuando los vea en el futuro. –

+1

Tenga en cuenta que, al usar literales de cadena, se comparan los _addresses_ de las cadenas, no las cadenas mismas. Será mejor que uses 'std :: string'. – sbi

Respuesta

28

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

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

Debe utilizar std::string en lugar de cadenas de C en sus tipos. Tal como está ahora, es probable que no obtengas los resultados que esperas porque la búsqueda de valores en el mapa se realizará mediante la comparación de punteros, no mediante la comparación de cadenas.

Si realmente desea utilizar cadenas de C (que, nuevamente, no debería), entonces necesita usar const char* en lugar de char* en sus tipos.

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

Necesita sobrecargar operator< para el tipo de clave o utilizar un comparador personalizado.

+2

'mapa [p1] =" Manzana ";' es aún más corto –

+2

@Peter: 'operator []' tiene una semántica diferente, y yo recomendaría no usarlo para insertar objetos en un 'map' (inserta un nuevo objeto si aún no existe uno, sobrescribe inmediatamente el objeto temporal recién creado). –

+0

Wow Eso fue un error feo, me olvidé de hacer el par. ¡Lo siento! Bueno, ahora funciona, pero no funcionó cuando estaba usando char * en lugar de const char *. ¿Cuál es el trato con const char * vs char * en este caso? ¡Gracias! – ccarpenterg

6

Aquí es 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; 
} 
+2

¿por qué? ¿Cómo es esto mejor que lo que el OP tenía con 'pair'? – user102008

+6

Um, porque se compila y se ejecuta correctamente? –

+0

el operador '' tal vez no sea tan previo como el de std :: pairs. – Jichao

1

Como alternativa a lo que James McNellis declaró:

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

usted podría utilizar mapa.insert({p1, "Manzana"});

-1

Nunca use esto para resolver la programación competitiva .Porque creo que su complejidad es más alta que log (n). Así que pensar en alternativas ..

+2

Esto no es realmente una respuesta, no dijiste lo que DEBERÍA hacer – yakobom

0

Esta es la voluntad de hacer exactamente lo que quiere

#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; 
} 
Cuestiones relacionadas