|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 20.07.2003, 17:45 Titel: std::map |
|
|
Hi Leutz
Ich bin dabei, eine 3D-Engine zu proggen, (mal sehen, obs was wird) 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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.07.2003, 20:12 Titel: |
|
|
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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:15 Titel: |
|
|
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
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:23 Titel: |
|
|
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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:26 Titel: |
|
|
Jo, das hat Christian aber im Buch net geschrieben . Ich glaubs dir aber . |
|
Nach oben |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:29 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:36 Titel: |
|
|
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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:50 Titel: |
|
|
Was tut for_each und for_each_second ?
(Ich hab fast mein ganzes C++ Wissen aus JLI 1 und 2) |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:55 Titel: |
|
|
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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 21.07.2003, 17:58 Titel: |
|
|
Vielen vielen Dank für deine Hilfe
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.07.2003, 18:04 Titel: |
|
|
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 |
|
|
|
|
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
|