2010-11-23 19 views
13

Aujourd'hui, j'ai créé une carte, où le type de valeur n'a pas de constructeur par défaut. J'ai été surpris de ne pas pouvoir utiliser operator [] pour insérer les éléments sur cette carte, mais j'ai dû utiliser la méthode insert. Alors, quelles sont exactement les exigences pour les types de clé et de valeur pour std :: map?Exigences de type pour std :: map

est court exemple ici:

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

Je compile comme ceci:

[[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&) 

Répondre

8

operator[] ne nécessite en effet par défaut-constructibilité parce que la sémantique de ce mandat de la méthode que si la clé ne pas mais existe, une entrée appropriée est créée. Ainsi:

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

va créer et stocker un nouvel objet TValue() si foo n'existe pas dans la carte et retourner une référence.

5

Ce site font une grande référence STL: http://www.sgi.com/tech/stl/

En fait, il est dit que la carte prend dispose de 2 arguments de type obligatoire, Key et Data. Data doit être Assignable, comme l'a dit Daniel. Key, cependant, doit être un type qui peut être utilisé avec le type Compare, c'est-à-dire Compare désigne un objet fonction dont les paramètres sont du type Key. Dans ce cas, l'objet de fonction par défaut Compare est std::less<T>, qui est un Strict Weak Ordering qui compare les objets de type T à l'aide du operator<. Par conséquent, si vous ne changez pas le type Compare, à savoir utiliser la valeur par défaut, std::less<T> sera utilisé avec le type Key, et donc operator< seront utilisés avec le type Key, et donc Key doit être comparable à operator<.

Espérons que ça aide! Je sais que c'est un peu gratuit et je ne veux pas être condescendant, mais je veux juste m'assurer qu'il est absolument clair comment raisonner à ce sujet.

+2

En principe, c'est une bonne réponse, mais cela n'explique pas pourquoi le code OP a échoué. –

+0

@Konrad Ah, mais c'est parce que je lui ai répondu AVANT qu'il a posté ses messages d'erreur. Tout ce qu'il avait posté à ce moment-là, c'était que ça ne marchait pas. – blwy10