 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
chris Guest
|
Posted: Wed Feb 08, 2006 6:02 pm Post subject: std::vector::pop_front() |
|
|
Ich habe o. g. Methode folgendermassen ersetzt:
std::vector <long> lv(10,999);
lv.assign(++lv.begin(), lv.end()); //statt pop_front()
Es kompiliert und läuft auch einwandrei unter Linux, habe es auch mal
mit valgrind laufen lassen und keine Fehlermeldung bekommen.
Trotzdem bin ich unsicher, ob das so zulaessig ist oder nicht.
Habe aber leider unter www.sgi.com keine Dokumentation zur
assign-Methode gefunden.
chris
--
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 |
|
 |
Raymond Haeb Guest
|
Posted: Wed Feb 08, 2006 7:10 pm Post subject: Re: std::vector::pop_front() |
|
|
chris <cb@delta-h.de>:
| Quote: | Ich habe o. g. Methode folgendermassen ersetzt:
std::vector <long> lv(10,999);
lv.assign(++lv.begin(), lv.end()); //statt pop_front()
Es kompiliert und läuft auch einwandrei unter Linux, habe es auch mal
mit valgrind laufen lassen und keine Fehlermeldung bekommen.
Trotzdem bin ich unsicher, ob das so zulaessig ist oder nicht.
|
Du solltest zumindest noch ein if(!lv.empty()) davor schreiben.
| Quote: | Habe aber leider unter www.sgi.com keine Dokumentation zur
assign-Methode gefunden.
|
Wie kannst Du Funktionen nutzen die Du nicht kennst?
Eine Alternative ist zb:
std::remove(lv.begin(),++lv.begin());
Raymond
--
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 |
|
 |
Falk Tannhäuser Guest
|
Posted: Wed Feb 08, 2006 7:10 pm Post subject: Re: std::vector::pop_front() |
|
|
chris wrote:
| Quote: | Ich habe o. g. Methode folgendermassen ersetzt:
std::vector <long> lv(10,999);
lv.assign(++lv.begin(), lv.end()); //statt pop_front()
Es kompiliert und läuft auch einwandrei unter Linux, habe es auch mal
mit valgrind laufen lassen und keine Fehlermeldung bekommen.
Trotzdem bin ich unsicher, ob das so zulaessig ist oder nicht.
|
Laut § 23.2.4.1/2 ist das fragliche assign() äquivalent zu
erase(begin(), end()); gefolgt von insert(first, last);
wobei in deinem Fall first und last durch das erase()
ungültig gemacht wurden - also Nicht Definiertes Verhalten
(d.h. typischerweise, dass es bei deinen Tests läuft, aber
dem Kunden um die Ohren fliegt...).
Abhilfe:
lv.erase(lv.begin());
Man muss bloss im Hinterkopf behalten, dass hierbei alle
hinter dem gelöschten Element stehenden Elemente um eins
nach vorne verschoben werden, was bei größeren Datenmengen
langsam ist. Vgl. § 23.2.4.3/3-4. Aus diesem Grunde hat
std::vector auch von Haus aus kein pop_front() und push_front().
MfG
Falk
--
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 |
|
 |
Thomas Jakob Guest
|
Posted: Wed Feb 08, 2006 7:10 pm Post subject: Re: std::vector::pop_front() |
|
|
chris wrote:
| Quote: | Ich habe o. g. Methode folgendermassen ersetzt:
std::vector <long> lv(10,999);
lv.assign(++lv.begin(), lv.end()); //statt pop_front()
Es kompiliert und läuft auch einwandrei unter Linux, habe es auch mal
mit valgrind laufen lassen und keine Fehlermeldung bekommen.
Trotzdem bin ich unsicher, ob das so zulaessig ist oder nicht.
Habe aber leider unter www.sgi.com keine Dokumentation zur
assign-Methode gefunden.
chris
|
Wie wärs einfach mit folgendem:
lv.erase(lv.begin());
Dafür ist std::vector aber im Allgemeinen nicht gedacht. Nimm doch deque
oder list.
--
Greetings, Thomas Jakob
quicix (at) gmail (dot) com
--
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 |
|
 |
chris Guest
|
Posted: Wed Feb 08, 2006 9:10 pm Post subject: Re: std::vector::pop_front() |
|
|
| Quote: | Wie kannst Du Funktionen nutzen die Du nicht kennst?
|
Scott Meyers "Effective STL", eines der ersten Themen handelt über
assign.
--
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 |
|
 |
chris Guest
|
Posted: Wed Feb 08, 2006 9:10 pm Post subject: Re: std::vector::pop_front() |
|
|
| Quote: | lv.erase(lv.begin());
|
Ja, so werde ich es machen!
Manchmal sieht man den Wald vor lauter Bäumen nicht.
Das vector nicht dafür geeignet ist, ist mir bewusst. Er hat aber den
Vorteil, dass man ihn an C-Funktionen übergeben kann, was in meinem
Fall interessant ist.
Ausserdem ist es keine Performance-relevante Stelle in meinem Code.
Vielen Dank!
chris
--
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
|
|