Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » std::list [] operator

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.10.2004, 14:52 Uhr
~Gast
Gast


Hi,

ich brauche für ein, zwei Operationen und Debugzwecke den []-Operator für eine std::list. Leider kriege ich es nicht hin, solch einen Benutzerdefineirten Operator zu programmieren.

Danke,
Gast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.10.2004, 15:01 Uhr
(un)wissender
Niveauwart


std::list ist schon fertig da brauchste nicht mehr machen (darfst auch nicht)!

Ansonsten sieht die Signatur eine operator[] so aus

C++:
meinListInhalt & meineList::operator[](unsigned index)
//und
const meinListInhalt & meineList::operator[](unsigned index) const
//oder
const meinListInhalt meineList::operator[](unsigned index) const


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.10.2004, 15:05 Uhr
~Gast
Gast


dann geht es eben nicht...

Danke, wissender...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.10.2004, 15:18 Uhr
virtual
Sexiest Bit alive
(Operator)


Eigentlich willst Du ja nicht zwingend einen op[], sondern einfach eine Funktion/Methode über index auf die Elemente zuzugreifen. Funktional identisch mit Deinem Vorhaben sind folgende Funktionstemplates, die sich auf jeden Container anwenden lassen sollten:


C++:
#include <list>
#include <iostream>
#include <stdexcept>

// non const version
template<class C>
typename C::value_type& container_at(C& c, unsigned index) {
    typename C::iterator i=c.begin();
    typename C::iterator e=c.end();
    while (index-- && i!=e) {
        ++i;
    }
    if (i==e) throw std::out_of_range("Index out of range");
    return *i;
}

// const version
template<class C>
const typename C::value_type& container_at(const C& c, unsigned index) {
    typename C::const_iterator i=c.begin();
    typename C::const_iterator e=c.end();
    while (index-- && i!=e) {
        ++i;
    }
    if (i==e) throw std::out_of_range("Index out of range");
    return *i;
}      
    


int main() {
    std::list<const char*> l;
    l.push_back("~gast");
    l.push_back("(un)wissender");
    l.push_back("~gast");
    l.push_back("virtual");
    
    for(unsigned i=0; i<l.size(); ++i)
    {  
        std::cout<<"Posting "<<i<<" kam von User "<<container_at(l,i)<<std::endl;
    }
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.10.2004, 15:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Nachtrag:
natürlich gibt es einen Grund, warum der op[] für listen nicht in der STL ist: man hat beoim Design auf die Operationen verzichtet, die sich durch allzu schlechtes Laufzeitverhalten auszeichnen. Eine Liste ist für schnelles Einfügen/entfernen optimiert.

Oft is es sinnvoll, grade bei nicht sonderlich komplexen Listenelementen, die liste schlicht und einfach temp. in einen Vektor zu kopieren/wandeln, Obige Schleife in main wäre ein Beispiel dafür: gemessen an den Zugriffen über einen Index ist der Rechenaufwand zum Kopieren der Liste in einen Vector manchmal kleiner, jedenfalls ab einer gewissen anzahl Elemente.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 05.10.2004 um 15:26 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.10.2004, 21:59 Uhr
~Gast
Gast


Aha,

ich habe ein letztes Problem. Wie muss man eigentlich eine Templatefunktion exportieren, oder wie muss ich eine Templatenfunktion angeben, wenn ich sie in eine DLL packen möchte?

Danke,
Gast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.10.2004, 09:22 Uhr
virtual
Sexiest Bit alive
(Operator)


Garnicht. Templates sind - wie die Wörtliche Übersetzung bereits andeutet - "Vorlagen". Diese werden erst durch ihre Benutzung wirklich realisiert. Daher gehört alles, was mt Templates zusammenhängt in Header.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.10.2004, 15:31 Uhr
~Gast
Gast


Aha, das wusste ich auch nicht.

Dann kann ich ja meine Funktion in einer DLL-Datei vergessen.

Danke...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: