std:: vector -> index eines gegebenen Elements?



  • Hallo gibt es eine bessere Lösung als das durchiterieren und den Vergleich mit jedem Element im Vector um den Index eines gegebenen Elementes zu finden?

    Gruß HaJo



  • Ist der vector vorsortiert? Wenn ja, könntest du zumindest die Suchzeit drücken 😉



  • Wenn der vector unsortiert ist, könntest du auch std::find() verwenden (gut, das macht auch nichts anderes als durchiterieren und vergleichen, aber ist kürzer zu schreiben), bei einem sortierten vector bietet sich std::lower_bound() an (das verwendet binäre Suche, ist also ein Stück schneller).

    Beide Funktionen liefern einen Iterator auf das gefundene Element - indem du vec.begin() davon abziehst, kommst du zu deinem Index.

    PS: Und wenn du den vector einmal aufbaust und dann sehr oft darin suchen willst, sortier ihn lieber.



  • Nein nicht vorsortiert, es ist in Standartvector der stl.

    #include <vector>
    using namespace std;
    .
    .
    .
    vector <MyClass*>* pVec;
    .
    .
    .
    

    Es werden unsortiert eigene Objekte reingepackt.

    Es geht mir weniger um die Geschiwindigkeit, als um die Frage ob ich vielleicht eine einfache Methode getIndexOf() übersehen habe.

    Gruß



  • danke! Die Methode find() hatte ich noch im Hinterkopf, mir war aber nicht klar, dass ich durch einfaches Abziehen von pVec->begin() auf den Index komme!!!

    Das Sortieren ist in meinem Fall nicht möglich, da die Reihenfolge der Elemente im Vektor ständig umsortiert werden muss und für die Lösung der Aufgabe wichtig ist.

    Ihr wart mir eine große Hilfe.



  • Hajo32 schrieb:

    Nein nicht vorsortiert, es ist in Standartvector der stl.

    Auch einen vector kann man sortiert halten 😉

    Und wenn dir die Suchschleife zu viel Schreibarbeit ist, mach es mit find (eventuell auch mit find_if):

    vector<MyClass*>::iterator pos=find(pVec.begin(),pVec.end(),SampleData);
    if(pos==pVec.end())
      cout<<"nicht gefunden"<<endl;
    else
      cout<<"gefunden an Index "<<pos-pVec.begin()<<endl;
    

Anmelden zum Antworten