J'ai deux classes: une classe Object et une classe ObjectManager. La classe ObjectManager stocke "Objects" via un conteneur ptr_vector. Dans certains cas, j'ai besoin de récupérer des références à ces pointeurs stockés pour effectuer des actions individuelles sur ceux-ci. Comment ferais-je cela?Comment récupérer une référence à partir d'un boost ptr_vector?
compilable Pseudo Code:
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>
class Object
{
public:
int m_Id;
Object(int id) : m_Id(id) { }
};
class ObjectManager
{
private:
typedef boost::shared_ptr<Object> ObjectPtr;
typedef boost::ptr_vector<Object> ObjectVectorPtr;
typedef ObjectVectorPtr::iterator ObjectIt;
ObjectVectorPtr vector_;
void AddObject(Object *obj) {
vector_.push_back(obj);
}
ObjectPtr FindObject(int id) {
for (ObjectIt it = vector_.begin(); it != vector_.end(); it++) {
if (it->m_Id == id) {
// Found the object...How to return a shared_ptr reference to it?
// The line below is invalid, obviously:
// cannot convert parameter 1 from 'Object' to 'const boost::shared_ptr<T> &'
return *it;
}
}
// We could not find anything.
return ObjectPtr();
}
};
Fondamentalement, je veux le ObjectManager de conserver la propriété, mais je veux également d'autres classes pour être en mesure d'obtenir une référence à l'objet, les méthodes d'appel d'utilisation sur cet objet en fonction de ce qui est passe, et continue.
Ahh, merci Steve! De plus, si cela ne vous dérange pas de répondre, lorsque vous dites «n'utilisez pas ce type de correspondance si le conteneur devient grand», faites-vous référence à des problèmes de performance? – jbaez
@jbaez: oui ceci est lié à un perf - l'appariement comme ceci sera O (n) - la recherche de la carte (arbre binaire) est O (log n) –