 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Rüdiger Ranft Guest
|
Posted: Wed Apr 26, 2006 6:17 pm Post subject: Teplate für verschiedne Containerarten er zeugen |
|
|
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
|
Posted: Thu Apr 27, 2006 1:06 pm Post subject: Re: Teplate für verschiedne Containerarten erzeugen |
|
|
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
|
Posted: Tue May 02, 2006 4:18 pm Post subject: Re: Teplate für verschiedne Containerarten erzeugen |
|
|
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 |
|
 |
|
|
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
|
|