wie kann ich STL-Algorithmen mit einem Vektor von Zeigern verwenden
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!
Lösung
könnten Sie Indirekte Iterator Erhöhung . Wenn dereferenziert (mit Hier ist ein einfaches Beispiel: 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
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.