schönes c++?
-
-
DEvent schrieb:
Die Sprache C++ bietet eine swap-Funktion oder swap-Konstrukt? Das ist mir neu.
Dir mag vieles an C++ neu sein. Ja, die Sprache ermöglicht ein einfach anzuwendendes
swap()
, ganz im Gegensatz zu Java, wo sich für einen generischen Tausch eine Inline-Lösung immer noch am meisten lohnt.P.S.: Nein, ich habe grundsätzlich nichts gegen Java. Aber die ganze Zeit oberflächlich von High-Level-Sprache zu sprechen und Probleme, die Low-Level-Workarounds erfordern, damit rechtzufertigen ist etwas fragwürdig.
-
volkard schrieb:
DEvent schrieb:
Die Sprache C++ bietet eine swap-Funktion oder swap-Konstrukt? Das ist mir neu.
Ätsch. Besonderes Fachwissen ist das gemeinsame Merkmal der Anti-C++-Trolle.
er meint ja die sprache. hat er extra kursiv geschrieben, nicht irgendwelche funktionen einer library (auch wenn sie dabei ist).
btw, kennt einer eigentlich ein sinnvolles beispiel, bei dem objekte selbst geswappt werden müssen? eigentlich reichts doch immer, wenn man referenzen rumschubst anstatt objektinhalte auszutauschen.
-
§25.2.2. Also gehörts zur Sprache. Klugscheißer.
-
volkard schrieb:
DEvent schrieb:
Wieso war beides kein swap?
Nach dieser Definition frag ich mich überhaupt ob eine Funktion in eine funktionale Programmiersprache überhaupt Swap heissen darf. XD
-
Wie ist das eigentlich wieder zu einem weiteren Java vs. C++ - Thread geworden?
Ob Java oder nun C++ besser ist, stand eigentlich nie zur Debatte.
-
Michael E. schrieb:
§25.2.2. Also gehörts zur Sprache. Klugscheißer.
Clauses 2 through 16 describe the C++ programming language. That description includes detailed syntactic specifications in a form described in 1.6. For convenience, Annex A repeats all such syntactic specifications.
Clauses 17 through 27 (the library clauses) describe the Standard C++ library, which provides definitions for the following kinds of entities: macros (16.3), values (clause 3), types (8.1, 8.3), templates (clause 14), classes (clause 9), functions (8.3.5), and objects (clause 7).
-
Nanyuki schrieb:
Wie ist das eigentlich wieder zu einem weiteren Java vs. C++ - Thread geworden?
Ob Java oder nun C++ besser ist, stand eigentlich nie zur Debatte.dabei enthält des OPs posting genug hinweise zum ablästern über c++, ohne dass man Java überhaupt erwähnen müsste. echt schwache vorstellung diesmal. *fg*
-
Daniel E. schrieb:
Michael E. schrieb:
§25.2.2. Also gehörts zur Sprache. Klugscheißer.
Clauses 2 through 16 describe the C++ programming language. That description includes detailed syntactic specifications in a form described in 1.6. For convenience, Annex A repeats all such syntactic specifications.
Clauses 17 through 27 (the library clauses) describe the Standard C++ library, which provides definitions for the following kinds of entities: macros (16.3), values (clause 3), types (8.1, 8.3), templates (clause 14), classes (clause 9), functions (8.3.5), and objects (clause 7).
da hast du's michael E. <-- selber klugscheisser.
-
Dann hast du wohl wieder im Erbsenzählen gewonnen. Herzlichen Glückwunsch. Da kann keiner mithalten. Klugscheißer.
-
;fricky schrieb:
kennt einer eigentlich ein sinnvolles beispiel, bei dem objekte selbst geswappt werden müssen?
naja z.b. beim sortieren von arrays etc.
eigentlich reichts doch immer, wenn man referenzen rumschubst anstatt objektinhalte auszutauschen.
in C++ arbeitet man wo es geht mit value-semantics, und nicht mit reference-semantics, weil's einfach schneller ist (weil keine/weniger dynamische speicheranforderungen z.b.).
-
Michael E. schrieb:
Dann hast du wohl wieder im Erbsenzählen gewonnen. Herzlichen Glückwunsch. Da kann keiner mithalten. Klugscheißer.
naja du hast ja wohl mit erbsenzählen angefangen. die unterscheidung sprache <-> library ist zumindest für mich total klar, und somit auch klar dass std::swap nicht zur sprache gehört.
-
hustbaer schrieb:
;fricky schrieb:
kennt einer eigentlich ein sinnvolles beispiel, bei dem objekte selbst geswappt werden müssen?
naja z.b. beim sortieren von arrays etc.
ok, aber swappen innerhalb von arrays ist ja in Java kein problem (^^hab weiter oben ein beispiel gezeigt).
hustbaer schrieb:
eigentlich reichts doch immer, wenn man referenzen rumschubst anstatt objektinhalte auszutauschen.
in C++ arbeitet man wo es geht mit value-semantics, und nicht mit reference-semantics, weil's einfach schneller ist (weil keine/weniger dynamische speicheranforderungen z.b.).
wieso schneller? umschaufeln der speicherinhalte ganzer objekte kann doch nicht schneller sein, als das umhängen von referenzen.
-
Die value-semantics sagt aus wie man dem Assignment-Operator zur interpretieren hat und nicht ob ich nun den Wert oder die Referenz swappe.
Weil template <class T> void swap(T& x,T& y) kann ich SmartPointer übergeben und Sematisch werden ist das halt ein Referenztausch, oder - versteh ich C++ zu schlecht?
-
Zeus schrieb:
Weil template <class T> void swap(T& x,T& y) kann ich SmartPointer übergeben und Sematisch werden ist das halt ein Referenztausch, oder - versteh ich C++ zu schlecht?
ich verstehe von c++ wahrscheinlich viel weniger als du, aber für mich sieht das so aus, als sollen die inhalte von x und y selbst getauscht werden. sind x und y nun ziemlich grosse objekte, dürfte so'n tausch verdammt ungeil sein. sind x und y pointer, wäre es viel schneller. deswegen ja (immer noch) meine frage: wann ist es sinnvoll, objektinhalte selbst zu swappen anstatt referenzen (oder pointer).
und noch 'ne frage: da man ja nicht einfach rohen speicher rumschaufeln sollte (wie Nexus z.b. erzählt hat), wie funktioniert so'n tausch überhaupt? bei nichttrivialen objekten müssten es doch tiefe kopien werden. sowas macht C++ ja nicht automatisch (Java aber kann das, hähä). müssen die objekte 'swappable' sein, oder wie läuft das?
-
;fricky schrieb:
müssen die objekte 'swappable' sein, oder wie läuft das?
quasi. Ein Objekt ist swappable, wenn für jeden Member gilt: er ist swappable. Merke: ist ein Objekt kopierbar, ist es swappable. Solange man also nicht mit zeigern rumhantiert ist man automatisch auf der sicheren Seite.
-
;fricky schrieb:
sind x und y nun ziemlich grosse objekte, dürfte so'n tausch verdammt ungeil sein.
Wenn für die Klasse kein
swap()
bereitstellt, ist das sehr gut möglich. Sobald man aber eine sinnvolle Tauschfunktion einrichtet, wird ein Tausch nicht nur exceptionsicher, sondern sehr performant, wie schon Shade Of Mine erzählt hat. Das ist ja das Gute: Wenn du z.B. zwei Container mit mehreren Millionen Elementen hast, kannst du diese in konstanter Zeit austauschen. Das läuft fast aufs Gleiche wie ein Zeigertausch hinaus, funktioniert aber auch, wenn beide Objekte im automatischen Speicherbereich angelegt wurden.Sei doch bitte in Zukunft etwas mehr auf diese Weise interessiert, solche Diskussionen mag ich nämlich.
-
hustbaer schrieb:
naja du hast ja wohl mit erbsenzählen angefangen.
DEvent schrieb:
Nexus schrieb:
Das Inline-Schreiben des Tauschs über drei Zuweisungen ist meiner Ansicht nach eher Low-Level als ein
swap()
-Funktionsaufruf, weil die temporäre Variable ein Implementierungsdetail ist.In diesem Punkt abstrahiert C++ sogar besser, da es eine fertige Funktion für sowas anbietet und es dem Aufrufer egal sein kann, auf welche Weise zwei Objekte getauscht werden.
Die Sprache C++ bietet eine swap-Funktion oder swap-Konstrukt? Das ist mir neu.
-
otze schrieb:
Ein Objekt ist swappable, wenn für jeden Member gilt: er ist swappable. Merke: ist ein Objekt kopierbar, ist es swappable.
ok, und was macht ein objekt nichtkopierbar? wenn es zu komplex ist, d.h. viele referenzen bzw. pointer auf andere objekte hat, die wiederum welche auf irgendwas haben usw? und wieso wird swap mit kopieren gleichgesetzt? bei einer kopie entsteht ja ein duplikat, beim swap höchstens temporär, in der swapfunktion. wenn man von objekten dauerhafte kopien macht, dann besteht ja die gefahr, dass irgendwelche 1:1-beziehungen ungewollt vervielfacht werden, was ja bei einem swap nicht der fall ist.
Nexus schrieb:
Sobald man aber eine sinnvolle Tauschfunktion einrichtet, wird ein Tausch nicht nur exceptionsicher, sondern sehr performant.
aha, man muss tauschfunktionen selber schreiben (was die klasse swappable macht), sonst tut swap nix, bzw. macht einfach ein paar 'memcpys', ne?
Nexus schrieb:
Das ist ja das Gute: Wenn du z.B. zwei Container mit mehreren Millionen Elementen hast, kannst du diese in konstanter Zeit austauschen. Das läuft fast aufs Gleiche wie ein Zeigertausch hinaus...
kann doch garnicht sein. wenn der tausch zweier objekte die zeit t braucht, dann braucht's um 2 mio. objekte zu tauschen 1000000*t. wenn nicht, wie funktioniert dieser trick?
Nexus schrieb:
Sei doch bitte in Zukunft etwas mehr auf diese Weise interessiert, solche Diskussionen mag ich nämlich.
hihi, du fühlst dich dann wie daheim, im C++ unterforum *fg*
keine angst, meine einstellung zu C++ bleibt weiterhin extrem kritisch (wüsste auch nicht, was das ändern könnte), aber ein paar hintergrundinfos zu erfragen, kann ja nicht schaden und ausserdem kann mir in diesem thread dann auch keiner vorwerfen, dass ich nicht 'über den tellerrand' schauen will.
-
Bei der swap Geschichte hatte ich jetzt den Überblick verloren, aber die meisten Sprachen haben dazu bereits den operator = eingeführt.