come uso gli algoritmi STL con un vettore di puntatori
Domanda
Ho un vettore di puntatori che non sono di proprietà del contenitore. Come uso gli algoritmi sugli obiettivi dei puntatori. Ho provato ad usare boost's ptr_vector, ma tenta di eliminare i puntatori quando esce dall'ambito.
Ecco del codice che deve funzionare:
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.
Mi rendo conto che per i loop funzionerebbe, ma questo accade in molti punti, quindi una specie di adattatore unario? Non sono riuscito a trovarne uno. Grazie in anticipo!
Soluzione
Potresti utilizzare Boost Iteratore indiretto . Quando viene referenziato (con operator*()
), applica un extra dereference, quindi si finisce con il valore puntato dal puntatore a cui fa riferimento l'iteratore. Per ulteriori informazioni, puoi anche consultare questa domanda su un iteratore di dereference .
Ecco un semplice esempio:
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
Altri suggerimenti
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 non può assumere la funzione di assegnazione (in modo che dereferenzierebbe i puntatori). Pertanto è stato utilizzato for_each (). Per l'ottimizzazione sarebbe saggio aggiungere if (! Coerente) prima di eseguire for_each (). Funzioni utilizzate nelle righe sopra di STL:
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; }
Puoi guardare boost::shared_ptr<>
- un puntatore intelligente con conteggio dei riferimenti. Non eliminerà il puntatore dopo che è uscito dall'ambito.