Liste durchsuchen



  • Hallo,

    vor kurzem habe ich hier ja erfahren, wie man durch Listen iteriert :], nun will ich aber auch eine Liste nach einem bestimmten Wert durchsuchen. Entweder ich bin blind oder list hat keine eigene Methode dafür 😕

    Deshalb hab ich mal versucht eine eigene zu coden, so sieht die Sache aus:

    template <class T>
    bool labyPathFinder::find(std::list<T>& rList, const T& rFind, std::list<T>::iterator* pTarget) const
    {
        for(list<T>::iterator i = rList.begin();i != rList.end();++i)
        {
            if(*i == rFind)
            {
                if(pTarget)
                {
                    *pTarget = i;
                }
                return true;
            }
        }
        return false;
    }
    

    Das funktioniert soweit auch. Wenn ich allerdings den dritten Parameter mit folgendem Code ins Spiel bringe erhalte ich 4 merkwürdige Compiler-Fehler, die mir nichts sagen 😕

    labyPathFinder p;
        cout << p.find(lList, 7, &iIter) << endl;
        cout << *iIter << endl;
    

    lList ist eine list<int> und iIter list<int>::iterator. Wenn ich das ausführe erhalte ich diese Fehlermeldung vier mal:

    C:\Entwicklung\laby\laby.cpp(103) : error C2784: 'bool __thiscall labyPathFinder::find(class std::list<T,class std::allocator<T> > &,const T &,class std::list<T,`template-parameter258'>::iterator 😉 const' : could not deduce template argument for 'c
    lass std::list<_Ty,_A>::iterator *' from 'class std::list<int,class std::allocator<int> >::iterator *'

    Was sagt mir das? 😕
    Kann mir da einer weiterhelfen? Ich bin echt ratlos 😕
    Bin dankebar für jede Hilfe 🙂



  • Hi!
    Bei deinem Fehler bin ich mir nicht sicher, aber es könnte daran liegen, dass man keine Zeiger auf Iteratoren erzeugen darf. Da bin ich mir allerdings recht unsicher und sehe keinen wirklichen Grund.

    Du brauchst allerdings keine eigene Funktion schreiben, denn sowas gibt es schon:

    template<class InIt, class T>
        InIt find(InIt first, InIt last, const T& val);
    

    Benutzen kannst du es dann so:

    list <int>::iterator it = find(ilist.begin(), ilist.end(), 17);
    //Falls 17 nicht gefunden wurde, zeigt it auf list.end()
    if(it != ilist.end())
      cout << *it << endl;
    

    EDIT: Vergiss nicht <algorithm> einbinden!

    [ Dieser Beitrag wurde am 22.03.2003 um 12:32 Uhr von KPC editiert. ]



  • Entweder ich bin blind oder list hat keine eigene Methode dafür

    Nein Blind bist du nicht, du hast nur das fundamentale Konzept hinter der STL noch nicht verstanden. Der Clou dieser Bibltiohek ist es gerade, dass die einzelnen Container nicht jedesmal einen Haufen von Algorithmen mitbringen. Vielmehr gibt es nur einen Haufen von Algorithmen und dank der Iteratoren können alle Algos für alle Container verwendet werden.
    Ausnahmen bestätigen natürlich wie immer die Regel.

    Zu deinem Code:
    Unter der Annahme, dass iIter ein passender list-Iterator ist (also vom Type list<T>::iterator), ist der Code bis auf zwei fehlende typenames in Ordnung.
    Beide vorkommen von list<T>::iterator müssen mit typename qualifiziert werden, da iterator ein abhängiger Name ist.


Anmelden zum Antworten