JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=dffe8b0a5a4c6e913e5713b13e70bb40Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

std::map

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 17:45    Titel: std::map Antworten mit Zitat

Hi Leutz

Ich bin dabei, eine 3D-Engine zu proggen, (mal sehen, obs was wird) Very Happy und will eine
Code:
std::map<char*, LPDIRECT3DTEXTURE9> m_Textures;
einbauen, um die Texturen zu verwalten.

Frage:
Ich habe mir mal die Datei MAP angesehen. Haben die die extra so beschissen formatiert, damit man nichts erkennt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 20:12    Titel: Antworten mit Zitat

Code:

/*
 *
 * Copyright (c) 1994
 * Hewlett-Packard Company
 *
 * Copyright (c) 1996,1997
 * Silicon Graphics Computer Systems, Inc.
 *
 * Copyright (c) 1997
 * Moscow Center for SPARC Technology
 *
 * Copyright (c) 1999
 * Boris Fomitchev
 *
 * This material is provided "as is", with absolutely no warranty expressed
 * or implied. Any use is at your own risk.
 *
 * Permission to use or copy this software for any purpose is hereby granted
 * without fee, provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 *
 */

#ifndef _STLP_MAP
#define _STLP_MAP

# ifndef _STLP_OUTERMOST_HEADER_ID
#  define _STLP_OUTERMOST_HEADER_ID 0x43
#  include <stl/_prolog.h>
# endif

#include <stl/_map.h>

#if defined (_STLP_WHOLE_VENDOR_STD)
# include _STLP_NATIVE_HEADER(map)
#endif

# if (_STLP_OUTERMOST_HEADER_ID == 0x43)
#  include <stl/_epilog.h>
#  undef _STLP_OUTERMOST_HEADER_ID
# endif

#endif /* _STLP_MAP */

// Local Variables:
// mode:C++
// End:


Hmm? Kann man doch lesen...
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:15    Titel: Antworten mit Zitat

Dann hast du eine andere Version als ich.
Bei mir sieht die so aus:

Code:
// map standard header

#if     _MSC_VER > 1000
#pragma once
#endif

#ifndef _MAP_
#define _MAP_
#include <functional>
#include <xtree>

#ifdef  _MSC_VER
#pragma pack(push,8)
#endif  /* _MSC_VER */

_STD_BEGIN
      // TEMPLATE CLASS map
template<class _K, class _Ty, class _Pr = less<_K>,
   class _A = allocator<_Ty> >
   class map {
public:
   typedef map<_K, _Ty, _Pr, _A> _Myt;
   typedef pair<const _K, _Ty> value_type;
   struct _Kfn : public unary_function<value_type, _K> {
      const _K& operator()(const value_type& _X) const
      {return (_X.first); }
      };
   class value_compare
      : public binary_function<value_type, value_type, bool> {
      friend class map<_K, _Ty, _Pr, _A>;
   public:
      bool operator()(const value_type& _X,
         const value_type& _Y) const
         {return (comp(_X.first, _Y.first)); }
   _PROTECTED:
      value_compare(_Pr _Pred)
         : comp(_Pred) {}
      _Pr comp;
      };
   typedef _K key_type;
   typedef _Ty referent_type;
   typedef _Pr key_compare;
   typedef _A allocator_type;
   typedef _A::reference _Tref;
   typedef _Tree<_K, value_type, _Kfn, _Pr, _A> _Imp;
   typedef _Imp::size_type size_type;
   typedef _Imp::difference_type difference_type;
   typedef _Imp::reference reference;
   typedef _Imp::const_reference const_reference;
   typedef _Imp::iterator iterator;
   typedef _Imp::const_iterator const_iterator;
   typedef _Imp::reverse_iterator reverse_iterator;
   typedef _Imp::const_reverse_iterator const_reverse_iterator;
   typedef pair<iterator, bool> _Pairib;
   typedef pair<iterator, iterator> _Pairii;
   typedef pair<const_iterator, const_iterator> _Paircc;
   explicit map(const _Pr& _Pred = _Pr(), const _A& _Al = _A())
      : _Tr(_Pred, false, _Al) {}
   typedef const value_type *_It;
   map(_It _F, _It _L, const _Pr& _Pred = _Pr(),
      const _A& _Al = _A())
      : _Tr(_Pred, false, _Al)
      {for (; _F != _L; ++_F)
         _Tr.insert(*_F); }
   _Myt& operator=(const _Myt& _X)
      {_Tr = _X._Tr;
      return (*this); }
   iterator begin()
      {return (_Tr.begin()); }
   const_iterator begin() const
      {return (_Tr.begin()); }
   iterator end()
      {return (_Tr.end()); }
   const_iterator end() const
      {return (_Tr.end()); }
   reverse_iterator rbegin()
      {return (_Tr.rbegin()); }
   const_reverse_iterator rbegin() const
      {return (_Tr.rbegin()); }
   reverse_iterator rend()
      {return (_Tr.rend()); }
   const_reverse_iterator rend() const
      {return (_Tr.rend()); }
   size_type size() const
      {return (_Tr.size()); }
   size_type max_size() const
      {return (_Tr.max_size()); }
   bool empty() const
      {return (_Tr.empty()); }
   _A get_allocator() const
      {return (_Tr.get_allocator()); }
   _Tref operator[](const key_type& _Kv)
      {iterator _P = insert(value_type(_Kv, _Ty())).first;
      return ((*_P).second); }
   _Pairib insert(const value_type& _X)
      {_Imp::_Pairib _Ans = _Tr.insert(_X);
      return (_Pairib(_Ans.first, _Ans.second)); }
   iterator insert(iterator _P, const value_type& _X)
      {return (_Tr.insert((_Imp::iterator&)_P, _X)); }
   void insert(_It _F, _It _L)
      {for (; _F != _L; ++_F)
         _Tr.insert(*_F); }
   iterator erase(iterator _P)
      {return (_Tr.erase((_Imp::iterator&)_P)); }
   iterator erase(iterator _F, iterator _L)
      {return (_Tr.erase((_Imp::iterator&)_F,
         (_Imp::iterator&)_L)); }
   size_type erase(const _K& _Kv)
      {return (_Tr.erase(_Kv)); }
   void clear()
      {_Tr.clear(); }
   void swap(_Myt& _X)
      {std::swap(_Tr, _X._Tr); }
   friend void swap(_Myt& _X, _Myt& _Y)
      {_X.swap(_Y); }
   key_compare key_comp() const
      {return (_Tr.key_comp()); }
   value_compare value_comp() const
      {return (value_compare(_Tr.key_comp())); }
   iterator find(const _K& _Kv)
      {return (_Tr.find(_Kv)); }
   const_iterator find(const _K& _Kv) const
      {return (_Tr.find(_Kv)); }
   size_type count(const _K& _Kv) const
      {return (_Tr.count(_Kv)); }
   iterator lower_bound(const _K& _Kv)
      {return (_Tr.lower_bound(_Kv)); }
   const_iterator lower_bound(const _K& _Kv) const
      {return (_Tr.lower_bound(_Kv)); }
   iterator upper_bound(const _K& _Kv)
      {return (_Tr.upper_bound(_Kv)); }
   const_iterator upper_bound(const _K& _Kv) const
      {return (_Tr.upper_bound(_Kv)); }
   _Pairii equal_range(const _K& _Kv)
      {return (_Tr.equal_range(_Kv)); }
   _Paircc equal_range(const _K& _Kv) const
      {return (_Tr.equal_range(_Kv)); }
protected:
   _Imp _Tr;
   };


... und so weiter Shocked Shocked Shocked

Noch eine Frage:
Ich kann ja wie im Buch beschrieben neue Texturen erstellen und zur map hinzufügen. Muss ich den Speicher am Ende irgendwie wieder freigeben, oder macht die map das alleine?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:23    Titel: Antworten mit Zitat

Hmm kann man doch einigermaßen lesen. Und du musst den Speicher selber freigeben. Faustregel: Wenn du new aufrufst musst du auch selber delete aufrufen.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:26    Titel: Antworten mit Zitat

Jo, das hat Christian aber im Buch net geschrieben Rolling Eyes . Ich glaubs dir aber Very Happy Very Happy .
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:29    Titel: Antworten mit Zitat

Wie geb ich den Speicher denn am besten frei??? Wenn ich nicht extra speichere, welche Elemente ich hinzugefügt habe, weiß ich die einzelnen Namen der Elemente später doch net mehr.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:36    Titel: Antworten mit Zitat

So kannst du es cool mit nem Functor im STL Stil machen. ;)

Code:

struct TDelete
{
   template <typename T>
   void operator()(T *ptr)
   {
      delete ptr;
   }
};

for_each(DeineMap.begin(), DeineMap.end(), Tdeletet());
DeineMap.clear();


Diesen Functor kannst du bei allen Typen und mit allen Containern anwenden. Für for_each musst du noch "algorithm" inkludieren.

[Nachtrag]
Bei maps geht es nicht, wegen den Iteratoren. Bei den map-Iteratoren musst du das Element löschen, auf das ::second(first ist Schlüssel, second ist Inhalt) zeigt:

Code:

template<class _InIt, class _Fn1>
inline _Fn1 for_each_second(_InIt _First, _InIt _Last, _Fn1 _Func)
{
   for (; _First != _Last; ++_First)
      _Func(_First->second);
      return (_Func);
}


Damit geht es, also for_each_second aufrufen, anstatt for_each.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:50    Titel: Antworten mit Zitat

Confused Confused Confused
Was tut for_each und for_each_second ?
(Ich hab fast mein ganzes C++ Wissen aus JLI 1 und 2)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:55    Titel: Antworten mit Zitat

for_each ruft eine Funktion für alle Elemente auf, die zwischen _First und _Last liegen. Den Befehl gibt es auch in PHP falls dir das hilft. ;)

P.S.: Ich habe Christians Buch nicht gelesen, darum weiß ich nicht wie ausführlich er die STL behandelt hat. Die Algorithmen sollte man aber auch lernen.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 17:58    Titel: Antworten mit Zitat

Vielen vielen Dank für deine Hilfe Very Happy Very Happy Very Happy
Ich hab in nem Beispielprogramm ne Lösung gefunden:
Code:

map<string,LPDIRECT3DTEXTURE9>::iterator it;

for(it = m_MapTextures.begin(); it != m_MapTextures.end();it++)
{
    (it->second)->Release();
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 18:04    Titel: Antworten mit Zitat

Kein Problem. Ich find for_each nur praktischer als immer selber ne for-Schleife zu schreiben(Warum? Faulheit. :P). Dazu sind Templates ja da. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum