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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top