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



  • Hi,

    bisher hab ich meinen Iterator im Texturmanager vorwärtsgejagt, doch jetzt will ich aus speedgründen ich rückwärtslaufen lassen (da oft nur die hinteren texturen im Vector benutzt werden und er so einen kürzeren weg hat!)

    So hab ich ihn vorwärts gejagt:

    SDL_Surface* CTextureManager::getTexture (std::string FileName)
    {
    		// Durchlaufe den Vector
    	for (std::vector<TextureItem>::iterator it=this->m_vec_Textures.end(); it != this->m_vec_Textures.begin(); --it)
    	{
    			// Hat eine Textur im Vector den selben Namen wie angefordert?
    		if (it->FileName == FileName)
    		{
    				// Wenn ja, Textur zurückgeben, ansonsten weitersuchen.
    			return (it->Image);
    		}
    	}
    
    		// Wenn die Funktion bis hier hin kommt, ist die Textur nicht vorhanden.
    		// Drum geben wir NULL zurück
    	return NULL;
    }
    

    und jetzt hab ich versucht ihn so rückwärts laufen zu lassen, doch das will nicht 😞

    SDL_Surface* CTextureManager::getTexture (std::string FileName)
    {
    		// Durchlaufe den Vector
    	for (std::vector<TextureItem>::iterator it=this->m_vec_Textures.end(); it != this->m_vec_Textures.begin(); --it)
    	{
    			// Hat eine Textur im Vector den selben Namen wie angefordert?
    		if (it->FileName == FileName)
    		{
    				// Wenn ja, Textur zurückgeben, ansonsten weitersuchen.
    			return (it->Image);
    		}
    	}
    
    		// Wenn die Funktion bis hier hin kommt, ist die Textur nicht vorhanden.
    		// Drum geben wir NULL zurück
    	return NULL;
    }
    

    wieso geht das nicht? 😕



  • sorry das war der code für vorwärts:

    SDL_Surface* CTextureManager::getTexture (std::string FileName)
    {
    		// Durchlaufe den Vector
    	for (std::vector<TextureItem>::iterator it=this->m_vec_Textures.begin(); it<this->m_vec_Textures.end(); ++it)
    	{
    			// Hat eine Textur im Vector den selben Namen wie angefordert?
    		if (it->FileName == FileName)
    		{
    				// Wenn ja, Textur zurückgeben, ansonsten weitersuchen.
    			return (it->Image);
    		}
    	}
    
    		// Wenn die Funktion bis hier hin kommt, ist die Textur nicht vorhanden.
    		// Drum geben wir -1 zurück
    	return NULL;
    }
    


  • 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