Comment faire pour effacer des éléments de boost::ptr_vector
Donc j'essaye de me débarrasser de mon std::vector avec boost::ptr_vector. Maintenant, je vais essayer de supprimer un élément à partir d'un seul et ont été éliminés de l'élément supprimé. La chose la plus évidente pour moi, c'était à faire:
class A
{ int m; };
boost::ptr_vector<A> vec;
A* a = new A;
vec.push_back(a);
vec.erase(a);
Mais ce ne sera même pas compiler (voir ci-dessous le message d'erreur complet). J'ai essayé de l'effacer/supprimer un idiome comme je le ferais sur un std::vector, mais tous les algorithmes de boost::ptr_vector à son tour d'être légèrement différents de ceux std::vector.
Donc mes questions:
- Comment puis-je supprimer un pointeur à partir d'un ptr_vector?
- Ai-je encore besoin de supprimer manuellement (en) cet élément que j'ai supprimé?
Erreur de compilateur:
1>------ Build started: Project: ptr_vector_test, Configuration: Debug Win32 ------
1>Compiling...
1>ptr_vector_test.cpp
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2825: 'C': must be a class or namespace when followed by '::'
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\mpl\eval_if.hpp(63) : see reference to class template instantiation 'boost::range_const_iterator<C>' being compiled
1> with
1> [
1> C=A *
1> ]
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\range\iterator.hpp(63) : see reference to class template instantiation 'boost::mpl::eval_if_c<C,F1,F2>' being compiled
1> with
1> [
1> C=true,
1> F1=boost::range_const_iterator<A *>,
1> F2=boost::range_mutable_iterator<A *const >
1> ]
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\ptr_container\detail\reversible_ptr_container.hpp(506) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
1> with
1> [
1> C=A *const
1> ]
1> c:\tmp\ptr_vector_test\ptr_vector_test.cpp(21) : see reference to function template instantiation 'boost::void_ptr_iterator<VoidIter,T> boost::ptr_container_detail::reversible_ptr_container<Config,CloneAllocator>::erase<A*>(const Range &)' being compiled
1> with
1> [
1> VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
1> T=A,
1> Config=boost::ptr_container_detail::sequence_config<A,std::vector<void *,std::allocator<void *>>>,
1> CloneAllocator=boost::heap_clone_allocator,
1> Range=A *
1> ]
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2039: 'const_iterator' : is not a member of '`global namespace''
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2146: syntax error : missing ';' before identifier 'type'
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2208: 'boost::type' : no members defined using this type
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>Build log was saved at "file://c:\tmp\ptr_vector_test\Debug\BuildLog.htm"
1>ptr_vector_test - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
OriginalL'auteur Roel | 2008-12-10
Vous devez vous connecter pour publier un commentaire.
Eh bien, vous pouvez le faire avec un std::vector.
Dans les deux cas, effacer prend un itérateur en tant que paramètre.
Donc, avant de vous pouvez effacer quelque chose à partir d'un vecteur (ou une ptr_vector), vous devez localiser.
Également de noter que la ptr_vector traite son contenu comme si vous avez stocké un objet n'est pas un pointeur. De sorte que toute la recherche est faite via l'objet.
Donc, fondamentalement,
Exemple:
Merci, mon problème était que je n'avais pas défini l'opérateur == pour Un* const & qui semble être nécessaire. Pour obtenir votre exemple pour compiler (VC9), j'ai dû changer de "const& rhs" pour "Un* const& rhs" et modifier le contenu du corps en conséquence. Qui les rend difficile à utiliser avec la bibliothèque de classes.
Il vous manque le point! Le ptr_vector<> stocke les objets tels qu'ils sont un objet. Plutôt que de pervertir l'opérateur d'égalité viens de référence le pointeur. Si vous voulez trouver une exacte du pointeur, vous devez utiliser find_if et passer un prédicat.
OriginalL'auteur Martin York
Je pense que vous voulez l'appeler .release() sur le vecteur lieu de les effacer. Qui supprime l'entrée et la supprime de la mémoire.
Voir la section "Nouvelles Fonctions" pour des détails dans le tutoriel, ou vérifier la référence.
Sinon, vous avez besoin pour obtenir un itérateur sur un élément pour faire un appel à effacer(), je suis ot assurer Un* chiffres en termes de ptr_vector.
release
supprime le pointeur à partir du conteneur, et le récipient se rétrécit, mais l'objet n'est pas supprimé. Il a la même sémantique queauto_ptr
release
- vous simplement l'utiliser pour le transfert de gestion.OriginalL'auteur gbjbaanb
Vous pouvez utiliser erase_if modèle de méthode.
Utiliser boost::lambda pour écrire le prédicat comme une fonction lambda (en place).
OriginalL'auteur Lazin
La sémantique de
ptr_vector
sont très semblables à un régulièrevector
. Vous devez trouver un élément à l'avant, vous pouvez l'effacer.Comment puis-je trouver des choses dans un ptr_vector? boost::ptr_vector<A>::iterator it = std::find(vec.begin(), vec.end(), a); ne fonctionne pas. (erreur C2678: binary '==' : l'opérateur n'a pas trouvé ce qui prend de la main gauche opérande de type " A " (ou il n'est pas acceptable de conversion)).
Je suppose que j'ai besoin d'un ptr_iterator, mais que l'on semble être protégé (bien que j'ai pu trouver des offres pour des mailings listes où il a été utilisé, donc je suppose qu'il a été fait protégé plus tard...).
OriginalL'auteur James Hopkin
Chose de curieux: STL::vector<> est un Accès Aléatoire Conteneur, ce qui signifie qu'il utilise Les Itérateurs À Accès Aléatoire.
Donc vec.effacer(vec.begin()+N) va supprimer l'élément à l'indice N.
Noter que les sauts de l'ensemble de la itérateur mème et vous ne pouvez plus trivialement basculer entre les vecteurs et des listes de...
OriginalL'auteur Mr.Ree
Vous avez besoin d'utiliser le membre erase_if méthode avec un prédicat. Il n'y a pas besoin de supprimer le pointeur, le conteneur a la propriété.
(remarque c'est juste un exemple choisi pour des raisons de simplicité, à la situation dans le code réel, je suppose qu'on pourrait écrire un adapté bind/equal_to combo, ou de l'utilisation lambda)
Ou, comme alternative, appeler release sur le bon itérateur, si vous voulez continuer à utiliser l'objet.
OriginalL'auteur Pieter