Réécrire 'map' avec 'vector' (templates)
Bonjour,
Le but de mon exercice est de réécrire le conteneur 'map' à l'aide d'une classe Dictionnaire qui contient un tableau dynamique d'Associations.
Oui cela n'a pas de sens, mais ça permet de s'initier aux vectors et aux templates. :)
J'ai donc une classe Assoc, que voici...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| template<typename TypeCle, typename TypeValeur>
class Assoc{
private:
TypeCle cle; TypeValeur valeur;
public:
Assoc();
Assoc(TypeCle, TypeValeur);
virtual ~Assoc ();
virtual TypeCle getCle()const;
virtual void setCle(TypeCle);
virtual TypeValeur getValeur()const;
virtual void setValeur(TypeValeur);
virtual void affiche(ostream&)const;
};
template<typename TypeCle, typename TypeValeur>
ostream& operator<<(ostream&, const Assoc<TypeCle,TypeValeur>&); |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| template<typename TypeCle, typename TypeValeur>
Assoc<TypeCle,TypeValeur>::Assoc() {}
template<typename TypeCle, typename TypeValeur>
Assoc<TypeCle,TypeValeur>::Assoc(TypeCle c, TypeValeur v)
:cle(c), valeur(v) {}
template<typename TypeCle, typename TypeValeur>
Assoc<TypeCle,TypeValeur>::~Assoc () {}
template<typename TypeCle, typename TypeValeur>
TypeCle Assoc<TypeCle,TypeValeur>::getCle() const {
return cle;
}
template<typename TypeCle, typename TypeValeur>
void Assoc<TypeCle,TypeValeur>::setCle(TypeCle c) {
cle=c;
}
template<typename TypeCle, typename TypeValeur>
TypeValeur Assoc<TypeCle,TypeValeur>::getValeur() const {
return valeur;
}
template<typename TypeCle, typename TypeValeur>
void Assoc<TypeCle,TypeValeur>::setValeur(TypeValeur v){
valeur=v;
}
template<typename TypeCle, typename TypeValeur>
void Assoc<TypeCle,TypeValeur>::affiche(ostream &os) const {
os <<getCle() << ", " <<getValeur();
}
template<typename TypeCle, typename TypeValeur>
ostream& operator<<(ostream& os, const Assoc<TypeCle,TypeValeur>& a){
a.affiche(os);
return os;
} |
...et ma classe Dictionnaire qui doit contenir un tableau dynamique d'associations.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
template<typename TypeCle, typename TypeValeur>
class Dictionnaire {
private :
vector < Assoc<TypeCle, TypeValeur> > associations;
public :
Dictionnaire();
~Dictionnaire();
void put(TypeCle, TypeValeur);
TypeValeur get(TypeCle) const;
bool estVide() const;
int taille() const;
bool contient(TypeCle) const;
ostream& affiche(ostream&) const;
Dictionnaire& operator=(const Dictionnaire&);
};
template<typename TypeCle, typename TypeValeur>
ostream& operator<< (ostream& os, const Dictionnaire<TypeCle, TypeValeur>&); |
Code:
1 2 3 4 5 6 7 8 9 10 11
| template<typename TypeCle, typename TypeValeur>
Dictionnaire<TypeCle, TypeValeur>::Dictionnaire(): associations(10) { }
template<typename TypeCle, typename TypeValeur>
Dictionnaire<TypeCle, TypeValeur>::~Dictionnaire() { }
template<typename TypeCle, typename TypeValeur>
void Dictionnaire<TypeCle, TypeValeur>::put(TypeCle cle, TypeValeur valeur) {
Assoc<TypeCle, TypeValeur> a(cle, valeur);
associations.push_back(a);
} |
J'ai essayé des tester mon constructeur et ma méthode 'put' comme ceci :
Code:
1 2 3 4 5
| int main() {
Dictionnaire<string, int> dico;
dico.put("abricot", 235);
return 0;
} |
Mais j'ai les erreurs suivantes, et je ne comprend pas pourquoi.
main.cpp:(.text+0x12): undefined reference to `Dictionnaire<std::string, int>::Dictionnaire()'
main.cpp:(.text+0x23): undefined reference to `Dictionnaire<std::string, int>::~Dictionnaire()'
collect2: error: ld returned 1 exit status
Merci à vous.