C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Teplate für verschiedne Containerarten er zeugen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Rüdiger Ranft
Guest





PostPosted: Wed Apr 26, 2006 6:17 pm    Post subject: Teplate für verschiedne Containerarten er zeugen Reply with quote



Hallo *,

ich stehe vor dem Problem, ein Template zu erzeugen, das als Parameter
einen iterator eines STL Containers erhält, und die Ausgaben in einen
vector oder eine deque schreibt. Für die Eingabe kommen sowohl
"einfache" Container wie list und vector in Frage, aber auch map. Der
Algorithmus durchläuft den Ursprungscontainer mittels seiner
::const_iterator-en und kopiert die Werte des Ursprungscontainers in den
Zielcontainer. Dies geschieht durch eine Zuweisung wie
"Zielcontainer[index] = *quelliterator". Dies funktioniert aber nur
dann, wenn als Quellcontainer keine map auftritt.



Vereinfacht sieht das so aus:

template<typename iteratorTyp it, typename elementTyp et>
void tuEtwas( const it& src, et& dest )
{
dest = *src;
}

void blubb()
{
Typ xxx;
std::list<Typ> lll;
/* fülle lll*/
tuEtwas( yyy.begin(), lll );

/* Wunschzettel: */
std::map<Typ2, Typ> mmm;
/* fülle mmm */
tuEtwas( mmm.gegin(), xxx );
}

Mein Problem ist, das ich den Wert eines (list|deque|vector) iterators
mittels *iterator bekomme, bei einer map aber über iterator->second.
Gibt es eine möglichkeit, ein template so zu gestalten, dass es mit
beiden iteratorenarten zurechtkommt?


bye
Rudi
--
GPG encrypted mails preferred.
GPG verschlüsselte Mails bevorzugt.
---> https://dsred.ccc.de/085/tkuev <----

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Marcel Müller
Guest





PostPosted: Thu Apr 27, 2006 1:06 pm    Post subject: Re: Teplate für verschiedne Containerarten erzeugen Reply with quote



Hallo

Rüdiger Ranft schrieb:
Quote:
ich stehe vor dem Problem, ein Template zu erzeugen, das als Parameter
einen iterator eines STL Containers erhält, und die Ausgaben in einen
vector oder eine deque schreibt. Für die Eingabe kommen sowohl
"einfache" Container wie list und vector in Frage, aber auch map. Der
Algorithmus durchläuft den Ursprungscontainer mittels seiner
::const_iterator-en und kopiert die Werte des Ursprungscontainers in den
Zielcontainer. Dies geschieht durch eine Zuweisung wie
"Zielcontainer[index] = *quelliterator". Dies funktioniert aber nur
dann, wenn als Quellcontainer keine map auftritt.

Was spricht gegen std::copy und Konsorten?

Quote:
void blubb()
{
Typ xxx;
std::list<Typ> lll;
/* fülle lll*/
tuEtwas( yyy.begin(), lll );

/* Wunschzettel: */
std::map<Typ2, Typ> mmm;
/* fülle mmm */
tuEtwas( mmm.gegin(), xxx );

Das ist natürlich Unsinn, da der value_type von std::map<Typ2, Typ>
std::pair<Typ2, Typ> ist und nicht Typ.

Quote:
Mein Problem ist, das ich den Wert eines (list|deque|vector) iterators
mittels *iterator bekomme, bei einer map aber über iterator->second.
Gibt es eine möglichkeit, ein template so zu gestalten, dass es mit
beiden iteratorenarten zurechtkommt?

Nicht sinnvoll. Die Daten einer Map sind ja ohne die Schlüssel
unvollständig. Es ist also semantisch eine andere Aufgabenstellung.

Vielleicht lohnt sich mal ein Blick in Richtung boost::lambda. Damit
lassen sich solche Mappings relativ elegant darstellen. - Allerdings
geraten die Compiler ordentlich ins schwitzen.


Marcel

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rüdiger Ranft
Guest





PostPosted: Tue May 02, 2006 4:18 pm    Post subject: Re: Teplate für verschiedne Containerarten erzeugen Reply with quote



Marcel Müller schrieb:
Quote:
Hallo

Rüdiger Ranft schrieb:
ich stehe vor dem Problem, ein Template zu erzeugen, das als Parameter
einen iterator eines STL Containers erhält, und die Ausgaben in einen
vector oder eine deque schreibt. Für die Eingabe kommen sowohl
"einfache" Container wie list und vector in Frage, aber auch map. Der
Algorithmus durchläuft den Ursprungscontainer mittels seiner
::const_iterator-en und kopiert die Werte des Ursprungscontainers in den
Zielcontainer. Dies geschieht durch eine Zuweisung wie
"Zielcontainer[index] = *quelliterator". Dies funktioniert aber nur
dann, wenn als Quellcontainer keine map auftritt.

Was spricht gegen std::copy und Konsorten?

Leider ist der abzuarbeitende Algo "etwas" komplizierter als im Beispiel.

Quote:
Mein Problem ist, das ich den Wert eines (list|deque|vector) iterators
mittels *iterator bekomme, bei einer map aber über iterator->second.
Gibt es eine möglichkeit, ein template so zu gestalten, dass es mit
beiden iteratorenarten zurechtkommt?

Nicht sinnvoll. Die Daten einer Map sind ja ohne die Schlüssel
unvollständig. Es ist also semantisch eine andere Aufgabenstellung.

Vielleicht lohnt sich mal ein Blick in Richtung boost::lambda. Damit
lassen sich solche Mappings relativ elegant darstellen. - Allerdings
geraten die Compiler ordentlich ins schwitzen.

Nunja, ich hab mich mittlerweile für einen functor entschieden, der dem
Template übergeben wird, aber Danke für den Denkanstoß.

bye
Rudi
--
GPG encrypted mails preferred.
GPG verschlüsselte Mails bevorzugt.
---> https://dsred.ccc.de/085/tkuev <----

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.