?
GAH! Das liest sich wie die Microsoft-STL-Implementierung des VC++ 6.0 - die auch dementsprechend gut (bzw. schlecht) funktionierte.
Um die Frage zu beantworten: JA! Der Code ist sogar verdammt hässlich. Wenn du ne STL lesen willst, um die Interna zu verstehen, nimm die GNU libstdc++. Oder meinetwegen auch STLPort, obwohl die aus Kompatibilitätsgründen (STLPort will mit allen Compilern laufen) teilweise recht seltsame Präprozessor-Konstruktionen drin haben.
Wenn ich diesen speziellen Code richtig verstehe, dann sollte das eigentlich so heißen:
template<typename iterator_t,
typename count_t,
typename content_t,
typename distance_t>
inline iterator_t _Search_n(iterator_t first,
iterator_t nil, //not in list - direkt hinter dem Ende des Bereichs
count_t num,
const content_t& val,
distance_t *unused) {
distance_t len = 0;
_Distance(first, nil, len); //Irgendein Makro. Peusocode: len = last-first;
for (; len >= num; ++first, --len) {
iter_t pos = first;
for (count_t num_found = 0; ; ++pos, ++num_found)
if (num_found == num)
return first;
else if (!(*pos == val))
break;
}
return nil;
}
Das ist ein ziemlich ineffizienter Algorithmus, um einen gegebenen Wert in einer gegebenen Folge n-mal hintereinander zu finden. Ich persönlich hätte es eher so geschrieben:
template<typename iterator_t,
typename count_t,
typename content_t>
inline iterator_t search_n(iterator_t first,
iterator_t nil,
count_t num,
content const &val) {
count_t num_found = 0;
for(iterator_t pos = first;
(nil - pos) - num_found >= num; //nil - pos ist Pseudocode, aber da es
++pos) { //ja scheinbar ne Funktion gibt, die den
if(*pos == val) //Abstand zweier Iteratoren zurück gibt,
++num_found; //die halt einfach hier einsetzen.
else
num_found = 0;
if(num_found == num)
return pos;
}
return nil;
}
Das ist zwar nur so hingekladdet, aber ich glaube, dass es laufen sollte.