von std::find position zurueck bekommen statt iterator



  • heiho

    wie der titel schon sagt

    ich hab nen container welchen ich durchsuchen lass,
    die informationen darin sind in einer bestimmten reihenfolge,
    ich brauch nu nicht den inhalt sondern die position in dem container als wert
    beispiel:

    std::vector<int> vIntList;
    vIntList.push_back(3);
    vIntList.push_back(6);
    vIntList.push_back(22);
    vIntList.push_back(5);
    
    std::vector<int>::iterator iterResult = std::find(vIntList.begin(), vIntList.end(), 22);
    

    iterResult zeigt nun auf die 22, aber ich brauch die informationen das es an position 3 ist.

    bisher mach ich das mit einem schleifen durchlauf
    beispiel:

    std::vector<int> vIntList;
    vIntList.push_back(3);
    vIntList.push_back(6);
    vIntList.push_back(22);
    vIntList.push_back(5);
    
    for(std::size_t i = 0; i < vIntList.size(); ++i)
        if(vIntList[i] == 22)
            return ++i;
    

    Was ich fragen wollte, gibts fuer dieses problem ein algorithmus aus der standardbibliothek ?



  • Jap:

    size_t index = std::distance(vIntList.begin(), iterResult);
    


  • also

    std::vector<int>::iterator iterResult = std::find(vIntList.begin(), vIntList.end(), 22);
    std::size_t iPos = std::distance(vIntList.begin(), iterResult) + 1;
    

    ?

    Ist das performanter als ein schleifendurchlauf?



  • Für vector<> auf jeden Fall, bei list<> oder set<> dürfte es gleich schnell sein.

    (distance() verwendet für Random Access Iteratoren eine einfache Subtraktion, für Forward-und Bidirektionale Iteratoren eine Zählschleife)


Anmelden zum Antworten