Schleife rückwärts laufen lassen will nicht :(



  • nimm doch reverse iteratoren

    for(vector<Foo>::reverse_iterator i=vec.rbegin(); i!=vec.rend(); ++i)
    {
    }
    


  • nimm doch std::map



  • das ist ein Iterator der rückwärtsläuft? kewl wusste ich gar net 🙂 danke!



  • btw:
    ich würde die funktion so schreiben:

    struct TextureCompare
    {
    private:
      std::string fileName;
    public:
      TextureCompare(std::string const& fileName) : fileName(fileName) {}
      bool operator()(TextureItem const& item)
      {
        return item.getFileName() == fileName; //FileName ist doch wohl nicht public, oder?
      }
    };
    
    SDL_Surface* TextureManager::getTexture (std::string const& FileName)
    //wir wollen doch nicht sinnlos kopieren...
    {
      std::vector<TextureItem>::reverse_iterator i=
        std::find(textures.rbegin(), textures.rend(), TextureCompare(FileName));
      //ich mag keine ungarische notation
      if(i!=textures.rend()) return i->getImage();
      return 0;
    }
    


  • hi,

    danke könnte man statt ner extra klasse nicht das einfach so schreiben?

    inline bool compareItems (TextureItem const& item, FileName) 
      { 
        return (item.getFileName() == FileName);
      }
    


  • und wo zauberst du FileName her?



  • äähm wie du siehst hab ich da das std::String vergessen 😃 sorry 🙂 ich hoff aber du verstehst was ich meine, oda?



  • Oh, mir ist da ein Fehler unterlaufen :o

    statt find verlangt meine Version ein find_if

    Deine Funktion hat das Problem: woher nimmst du FileName?
    Woher soll find/find_if wissen welchern wert FileName hat

    du kannst aber auch TextureItem einen operator== für std::string spendieren, dann kannst du
    find(vec.rbegin(), vec.rend(), FileName);
    schreiben...



  • Hi,

    ich dachte mir das eher so:

    inline bool compareItems (TextureItem const& item, std::string const &FileName)  
      {  
        return (item.getFileName() == FileName); 
      }
    

    denn extra ne weitere klasse? findest du das nicht etwas umständlich? ich mein das müsste doch auch per funktion gehen, oder?

    FileName bekomm ich ja im parameter der getTexture() funktion



  • =Seraph= schrieb:

    FileName bekomm ich ja im parameter der getTexture() funktion

    ja, du schon. aber woher weiss find_if, dass du compare(*it, FileName) aufrufen willst?

    du rufst find_if ja dann so auf:
    find_if(vec.rbegin(), vec.rend(), compare);

    und somit weiß find_if nicht, woher es FileName nehmen soll...

    oder meinst du etwas anderes?

    du kannst ja einfach für texturen den operator== überladen:

    bool operator==(TextureItem const& item, std::string const& str)
    {
      return item.getFileName() == str;
    }
    

    und dann kannst du einfach

    find(vec.rbegin(), vec.rend(), FileName);
    aufrufen...

    ich finde die 'Klasse', (welche sich übrigens Functor schimpft und hier las Predicate verwendet wird - falls du googlen willst) schöner.

    aber jedem das seine


Anmelden zum Antworten