Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit 1 und 2-dimensionalen Arrays

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
21.09.2007, 11:57 Uhr
Kest
saint


Hi!

Wobei man betonen sollte, dass Klassen in C++ keine Strukturen wie in C sind, und man daher C-Funktionen auf Klassen nicht anwenden sollte. Deswegen ist das generell keine gute Idee mit >memcpy< Klassen zu kopieren.


Zitat von xXx:
Aber wie ist denn dann bitte std::copy implementiert, dass das das hin bekommt?

er kümmert sich nur ums Kopieren (deswegen ist er auch so trivial implementiert). Die Klassen stellen >Iteratoren< bereit, wie auch die fundamentalen Typen. Damit will ich sagen, dass >std::copy< nur vier Funktionen verwendet: >operator++<, >operator*<, >operator=<, und >operator!=<; aber wie sie implementiert sind, ist für ihn egal.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 21.09.2007 um 12:15 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
21.09.2007, 16:03 Uhr
0xdeadbeef
Gott
(Operator)


Das ist...so...nicht ganz korrekt.

Darüber, wie std::copy implementiert ist, macht der Standard keine Aussage. Der Algorithmus erwartet lediglich Eingaben, die die Konzepte "InputIterator" bzw. "OutputIterator" erfüllen - zum Beispiel hat die GNU libstdc++ für std::copy eine Reihe von Konkretisierungen, die std::memcpy benutzen - immer dann, wenn es um Basistypen geht.

Aus dem Standard entnommen:

Zitat von C++-Standard 25.2.1.1:

Effects: Copies elements in the range [first, last) into the range [result, result + (last - first)) starting from first and proceeding to last. For each non-negative integer n < (last-first), performs *(result + n) = *(first + n).


...die Beschreibung ist etwas schwammig, da std::copy das Konzept RandomAccessIterator nicht verlangt, und die meisten Implementierungen von std::copy werden das wohl in etwa so machen, wie du dir das vorstellst, aber du kannst nicht hingehen, eine halbe Iteratorklasse mit nur diesen Operationen erstellen, die an std::copy verfüttern und dann verlangen, dass dein Code portabel ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
21.09.2007, 18:30 Uhr
Kest
saint


Hast recht, auch wenn >operator++< für Iterieren, >operator*< für Zugreifen, >operator=< für Zuweisen und >operator!=< für Vergleichen steht. Sie waren nicht als Überladungen zu verstehen, sondern lediglich als Abkürzungen.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
21.09.2007, 18:37 Uhr
Kest
saint


Ist echt peinlich: klingt als ob ich mich rechtfertigen würde.
Die Betonung lang nicht auf ">operator++<, >operator*<, >operator=<, und >operator!=<;", sonder auf "aber wie sie implementiert sind, ist für ihn egal.".
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 21.09.2007 um 18:37 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
21.09.2007, 22:09 Uhr
0xdeadbeef
Gott
(Operator)


Ob std::copy diese Funktionen tatsächlich verwendet, definiert der Standard trotzdem nicht. Wenn er sie benutzt, dann in Operatorform - das schreiben die entsprechenden Iteratorkonzepte so vor. Festzuhalten ist - std::copy muss keinen, aber kann alle der Operatoren verwenden. In der Praxis heißt das, wenn du willst, dass dein Code standardkonform ist, muss dein Iterator sie alle unterstützen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
21.09.2007, 22:54 Uhr
Kest
saint


Wenn ein Iterator mit dem Notwendigen ausgestattet ist, was ihn zu einem >OutputIterator< machen (eigentlich nur >schreiben< und >iterieren<, wobei schreiben in die Gruppe >Zufreifen< fällt, und >iterieren< sowohl den >++< als auch den >++(int)< und blabla bla (das weißt du alles)), und es einen anderen Iteratror gibt, nämlich >InputIterator< (+ "==" und "!=" ...), dann muss >std::copy< mit ihnen arbeiten können, weil das laut Standard richtige Iteratoren sind, denn es schreibt vor, was ein Iterator so alles können muss; ob nun aber das ganze richtig kopiert wird, kümmert >std::copy< nicht. Das und nur das hab ich sagen wollen. Ich wollte gar nicht auf die Iteratore eingehen.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 21.09.2007 um 23:00 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
23.09.2007, 16:00 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



Zitat von 0xdeadbeef:

Schön, dass immer jemand rhetorische Fragen als echte missversteht...


Ich hab den smiley vergessen :-P
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 23.09.2007 um 16:00 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: