comment utiliser les algorithmes STL avec un vecteur de pointeurs
Question
J'ai un vecteur de pointeurs n'appartenant pas au conteneur. Comment utiliser des algorithmes sur les cibles des pointeurs. J'ai essayé d'utiliser le ptr_vector de boost, mais il essaie de supprimer les pointeurs lorsqu'il est hors de portée.
Voici un code qui doit fonctionner:
vector<int*> myValues;
// ... myValues is populated
bool consistent = count(myValues.begin(), myValues.end(), myValues.front()) == myValues.size();
auto v = consistent ? myValues.front() : accumulate(myValues.begin(), myValues.end(), 0) / myValues.size();
fill(myValues.begin(), myValues.end(), v);
// etc.
Je réalise que les boucles for fonctionneraient, mais cela se produit dans de nombreux endroits, donc une sorte d'adaptateur unaire? Je n'ai pas pu en trouver un. Merci d'avance!
La solution
Vous pouvez utiliser Boost Iterator indirect Lorsqu'elle est déréférencée (avec operator*()
), elle applique une déréférence supplémentaire , de sorte que vous obtenez la valeur indiquée par le pointeur référencé par l'itérateur. Pour plus d'informations, vous pouvez également consulter cette question sur un itérateur de déréférencement . .
Voici un exemple simple:
std::vector<int*> vec;
vec.push_back(new int(1));
vec.push_back(new int(2));
std::copy(boost::make_indirect_iterator(vec.begin()),
boost::make_indirect_iterator(vec.end()),
std::ostream_iterator<int>(std::cout, " ")); // Prints 1 2
Autres conseils
bool consistent = count_if(myValues.begin(), myValues.end(),
bind2nd(ptr_fun(compare_ptr), *myValues.front())) == myValues.size();
int v = consistent ? *myValues.front() : accumulate(
myValues.begin(), myValues.end(), 0, sum_int_ptr) / myValues.size();
for_each(myValues.begin(), myValues.end(), bind1st(ptr_fun(assign_ptr),v));
Fill ne peut pas prendre la fonction assign (pour qu’elle puisse déréférencer les pointeurs). Par conséquent, for_each () a été utilisé. Pour l'optimisation, il serait sage d'ajouter if (! Consistent) avant d'exécuter for_each (). Fonctions utilisées dans les doublures STL ci-dessus:
int sum_int_ptr(int total, int * a) { return total + *a; }
void assign_ptr(int v, int *ptr) { *ptr = v; }
bool compare_ptr(int* a, int pattern) { return *a == pattern; }
Vous pouvez regarder boost::shared_ptr<>
- un pointeur intelligent avec comptage de références. Il ne supprimera pas le pointeur une fois hors de portée.