Frage

Ich habe einen Vektor von Zeigern, die nicht vom Container gehören. Wie verwende ich Algorithmen auf den Zielen der Zeiger. Ich versuchte Schub des ptr_vector zu verwenden, aber es versucht, die Zeiger zu löschen, wenn es den Bereich verlässt.

Hier ist ein Code, der arbeiten muss:

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.

Ich weiß, dass für Schleifen funktionieren würde, aber dies geschieht in einer Reihe von Orten, so eine Art von einstelligem Adapter? Ich war nicht in der Lage, einen zu finden. Vielen Dank im Voraus!

War es hilfreich?

Lösung

könnten Sie Indirekte Iterator Erhöhung . Wenn dereferenziert (mit operator*()), gilt es eine zusätzliche dereferenzieren, so dass Sie mit dem Wert der durch den Iterator verwiesen Zeiger zeigt am Ende. Für weitere Informationen können Sie auch href="https://stackoverflow.com/questions/352152/is-there-a-dereferenceiterator-in-the-stl"> diese Frage zu einem dereferenzieren Iterator

Hier ist ein einfaches Beispiel:

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

Andere Tipps

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 kann nicht nehmen zuweisen Funktion (so dass es würde dereferenzieren Zeiger). Daher wurde for_each () verwendet. Zur Optimierung wäre es klug, wenn hinzufügen (! Konsistent) vor dem Ausführen for_each (). Funktionen, die oben STL Einzeiler verwendet in:

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; }

Sie können boost::shared_ptr<> finden - einen intelligenten Zeiger mit Referenzzählung. Es wird nicht um den Zeiger zu löschen, nachdem sie aus dem Geltungsbereich.

scroll top