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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top