2010-11-23 18 views
13

Hoy creé un mapa, donde el tipo de valor no tiene un constructor predeterminado. Me sorprendió que no pudiera usar el operador [] para insertar los elementos en este mapa, pero tuve que usar el método de inserción.Requisitos de tipo para std :: map

Entonces, ¿qué son exactamente los requisitos para la clave y los tipos de valores para std :: map?

Aquí es breve ejemplo:

#include <map> 

struct A 
{ 
    A(int){} 
}; 

int main() 
{ 
    std::map< int, A > m; 
    A a1(2); 
    A a2(3); 
    A a3(4); 
    m[5] = a1; 
    m[3] = a2; 
    m[2] = a3; 
} 

Estoy compilando así:

[[email protected] tmp]$ g++ b5.cpp -Wall -Wextra -ansi -pedantic 
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stl_map.h: In member function ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = A, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, A> >]’: 
b5.cpp:14: instantiated from here 
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stl_map.h:419: error: no matching function for call to ‘A::A()’ 
b5.cpp:5: note: candidates are: A::A(int) 
b5.cpp:4: note:     A::A(const A&) 

Respuesta

8

operator[] en efecto, requieren default-constructibilidad porque la semántica de este mandato método que si la clave no hace aún existen, se crea una entrada apropiada. Por lo tanto:

map<TKey, TValue> mymap; 
TKey foo = …; 
TValue& x = mymap[foo]; 

va a crear y almacenar un nuevo objeto TValue() si foo no existe en el mapa, y devolver una referencia a él.

5

Este sitio crea una gran referencia STL: http://www.sgi.com/tech/stl/

Básicamente, se dice que tiene un mapa toma obligatorios argumentos de tipo 2, y KeyData. Data debe ser Assignable, como dijo Daniel. Key, sin embargo, se indica que debe ser un tipo que se puede utilizar con el tipo Compare, es decir, Compare designa un objeto de función cuyos parámetros son del tipo Key. En este caso, el objeto de función predeterminado Compare es std::less<T>, que es un Strict Weak Ordering que compara objetos del tipo T con el operator<. Por lo tanto, si no se cambia el tipo, es decir, utilizar el valor predeterminado Compare, std::less<T> se utilizará con el tipo Key, y por lo tanto operator< se utilizará con el tipo Key, y por lo tanto es necesario que haya Key comparables con operator<.

Espero que ayude! Sé que es un poco gratuito y no pretendo ser condescendiente, pero solo quiero asegurarme de que está absolutamente claro cómo razonar al respecto.

+2

En principio, es una buena respuesta, pero no explica por qué falló el código del OP. –

+0

@Konrad Ah, pero eso es porque respondí ANTES de que publicara sus mensajes de error. Todo lo que había publicado en ese momento era que simplemente no funcionaba. – blwy10

Cuestiones relacionadas