list-Frage



  • Hi,

    kann man folgendes schöner machen?

    std::list<std::string> tfc::getRow (int id)
    {
        if (id > data_.size());
    
        data_it_ = data_.begin(); // hier sagt er warning
    
        for (unsigned long i=0; i<id; ++i, ++data_it_);
    
        return (*data_it_);
    }
    

    es handelt sich um eine liste, mit einer liste in der ein string ist. und diese beinhaltete liste mit strings möchte ich gerne ausgeben (je nach id).

    Doch hmn das gefällt mir nicht so und std::vector darf ich nicht benutzen. Kann man das schöner machen? 😮



  • Was für ne Warnung?



  • fehlt da nicht ein teil? von was für einem typ ist data_it? was genau hast du da für eine liste ? ist es wirklich eine liste die nochmal eine liste enthält, oder warum gibst du sonst std:list als "iterator obj" zurück?!
    noch wichtiger, was für einen compiler verwendest du



  • warning C4390: ';' : empty controlled statement found; is this the intent?



  • Das Problem liegt eine Zeile darüber:

    if (id > data_.size());
    
    // Heißt eigentlich:
    
    if(id > data.size())
        ;
    

    => Wenn id > data.size() ist dann tue nichts. Die Überprüfung bringt es nicht. Außerdem ist dein Iterator ohne Typ, die for-Schleife wieder zum Nichts-Tun da und der return-Typ passt imho nicht zum Rückgabetyp. Die Funktion ist kurzm schrott 🙂

    MfG SideWinder



  • asdfasdf schrieb:

    fehlt da nicht ein teil? von was für einem typ ist data_it? was genau hast du da für eine liste ? ist es wirklich eine liste die nochmal eine liste enthält, oder warum gibst du sonst std:list als "iterator obj" zurück?!
    noch wichtiger, was für einen compiler verwendest du

    std::list<std::list<std::string > >           data_;
    

    Ich benutze DevC++



  • @SideWinder
    wie sähe sie denn richtig aus? 😕



  • '#' schrieb:

    @SideWinder
    wie sähe sie denn richtig aus? 😕

    Dazu müsstest du die Aufgabenstellung die diese Funktion behandeln soll klar formuliert posten. Du scheinst aber nichtmal genau zu wissen was die Funktion machen soll.

    MfG SideWinder



  • @SideWinder

    Also, ich habe eine Liste in der ich eine liste mit mehren Strings habe. Diese wird durch eine andere Funktion gefüllt.

    Diese Funktion soll mir die Liste mit den Strings geben durch die Position in der Liste, wo die Liste mit Strings drin ist.

    Also ich will Liste samt Strings haben, aber nur die Liste mit Strings die an der Position der oberen liste gehalten ist.

    also id ist sogesehen die Position der oberen liste und diese Funktion soll mir halt die Liste ausgeben mit Strings die an dieser Position steht in der oberen Liste.



  • nutze den Algorithmus 'advance'. Der macht, je nach verwendetem Container, bzw. Iterator immer alles so optimal wie möglich. Weiter sollte data_it_ kein Member von tfc sein (warum?) - und dann kann man die Methode auch const machen.

    Alles zusammen:

    #include <cassert>
    #include <iterator>     // std::advance
    
    std::list<std::string> tfc::getRow( int id ) const 
    {
        assert( id < data_.size() && id > 0);
    
        std::list< std::list< std::string > >::const_iterator i = data_.begin();
        std::advance( i, id );
        return *i;
    }
    

    Gruß
    Werner


Anmelden zum Antworten