Bonjour,

J'ai un problème avec les iterateurs du C++.
Voici ma première classe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
class BodyPair{
	public:
		BodyPair(Body *body1, Body *body2);
	private:
		Body *body1;
		Body *body2;
};
Ainsi que celle-ci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
class AbstractPairManager{
	public:
		virtual void addPair(Body *, Body *) = 0;
		virtual void removePair(Body *, Body *) = 0;
		virtual const std::vector<BodyPair *> &getPairs() const = 0;
};
Et pour finir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
class MapPairManager : public AbstractPairManager{
	public:
		//override: addPair, removePair & getPairs
	private:
		std::map<std::string, BodyPair*> pairMap;
};
Ma question: comment overrider la méthod getPairs() dans ma classe MapPairManager de façon performante afin de retourner les valeurs de 'pairMap' ?
Actuellement, je suis obligé de copier les valeurs de 'pairMap' dans un std::vector afin de le retourner. Ce n'est pas très performant.

Ca ne me dérange pas de modifier la signature de la méthod getPairs() dans la classe 'AbstractPairManager' mais je ne veux pas faire apparaitre un 'std::map' afin de rester générique.

La seule solution que j'ai trouvé serait de créer mon propre iterator qui serait retourné par la méthode 'getPair()':
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
class GenericIterator{
	public:
		virtual BodyPair *next() = 0;
		virtual bool hasNext() = 0;
};
Ensuite d'overrider la classe afin de créer un iterator sur les valeur de la map:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
class MapIterator : public GenericIterator{
	public:
		BodyPair *next(){++mapIt; return mapIt->second;}
		//...
},
N'y a-t-il pas d'autre solution plus simple ? J'ai l'impression de sortir le bazooka pour tuer une mouche.

Merci d'avance.