Ich bin ein Java-Programmierer, der C / C ++ lernt. Ich weiß also, dass Java eine Funktion wie System.arraycopy () hat. um ein Array zu kopieren. Ich habe mich gefragt, ob es in C oder C ++ eine Funktion zum Kopieren eines Arrays gibt. Ich konnte nur eine Implementierung zum Kopieren eines Arrays finden, indem ich for-Schleife, Zeiger usw. Verwendete. Gibt es eine Funktion, mit der ich ein Array kopieren kann?
88
man memmove
undman memcpy
memcpy
, benutzenstd::copy
. Wenn Ihr Typ einen aussagekräftigen Kopierkonstruktor hat,memcpy
wird er das Falsche tun.Antworten:
Seit C ++ 11 können Sie Arrays direkt kopieren mit
std::array
:Hier ist die Dokumentation zu std :: array
quelle
B = A
.Da Sie nach einer C ++ - Lösung gefragt haben ...
quelle
<iterator>
<algorithm>
?Wie andere bereits erwähnt haben, würden Sie in C verwenden
memcpy
. Beachten Sie jedoch, dass dies eine Rohspeicherkopie ausführt. Wenn Ihre Datenstrukturen also einen Zeiger auf sich selbst oder aufeinander haben, zeigen die Zeiger in der Kopie weiterhin auf die Originalobjekte.In C ++ können Sie auch ,
memcpy
wenn Sie Ihre Array Mitglieder POD sind (die im wesentlichen Typen sind , die Sie auch unverändert in C verwendet haben könnten), aber im Allgemeinenmemcpy
wird nicht erlaubt sein. Wie bereits erwähnt, ist die zu verwendende Funktionstd::copy
.Allerdings sollten Sie in C ++ selten Raw-Arrays verwenden. Stattdessen sollten Sie entweder eine der Standardcontainer verwenden (
std::vector
ist in der Nähe von einer eingebauten in Reihe, und auch ich denke , die am nächsten Java - Arrays - näher als einfachen C ++ Arrays, in der Tat - aberstd::deque
oderstd::list
besser geeignet in einigen Fällen) oder, wenn Sie C ++ 11 verwenden,std::array
das den integrierten Arrays sehr nahe kommt, aber wie andere C ++ - Typen eine Wertsemantik aufweist. Alle hier genannten Typen können durch Zuordnung oder Kopierkonstruktion kopiert werden. Darüber hinaus können Sie mithilfe der Iteratorsyntax von opne zu einem anderen (und sogar von einem integrierten Array) "crosskopieren".Dies gibt einen Überblick über die Möglichkeiten (ich gehe davon aus, dass alle relevanten Header enthalten sind):
quelle
memcpy
Beispiel; Die Größe war auch falsch. Ich habe es jetzt behoben, danke.std:array
als ähnlichstd::vector
, da es eine feste Größe hat.Sie können die
memcpy()
, verwendenmemcpy()
kopiert die Werte vonnum
Bytes von der Position, auf die gezeigt wird,source
direkt in den Speicherblock, auf den gezeigt wirddestination
.Wenn sich das
destination
undsource
überlappen, können Sie verwendenmemmove()
.memmove()
kopiert die Werte vonnum
Bytes von der Position, auf die gezeigt wird,source
in den Speicherblock, auf den gezeigt wirddestination
. Das Kopieren erfolgt so, als ob ein Zwischenpuffer verwendet würde, sodass sich Ziel und Quelle überlappen können.quelle
memcpy
es falsch ist, dh das Kopieren von Bytes ist unzureichend.Verwendung
memcpy
in C,std::copy
in C ++.quelle
memcpy
sollte ein Compiler intrinsisch sein)?In C können Sie verwenden
memcpy
. In C ++std::copy
aus dem<algorithm>
Header verwenden.quelle
Ich mag die Antwort von Ed S., aber dies funktioniert nur für Arrays mit fester Größe und nicht, wenn die Arrays als Zeiger definiert sind.
Also die C ++ - Lösung, bei der die Arrays als Zeiger definiert sind:
Hinweis :
buffersize
Mit 1 muss nicht abgezogen werden:Siehe: https://en.cppreference.com/w/cpp/algorithm/copy
quelle
In C ++ 11 können Sie dies
Copy()
für Standardcontainer verwendenquelle
std::end
, die Schleife aus der Schleife zu ziehen (c1 ändert oder macht die Iteratoren während der Schleife nicht ungültig, sodass das Ende nicht neu berechnet werden muss).Ich gebe hier zwei Möglichkeiten zum Bewältigen von Arrays für C- und C ++ - Sprache. memcpy und copy sind beide unter C ++ verwendbar, aber copy ist für C nicht verwendbar. Sie müssen memcpy verwenden, wenn Sie versuchen, das Array in C zu kopieren.
quelle
using namespace std;
ist eine schlechte Praxis . Benutze es niemals. Verwenden Sie anstelle von cplusplus.com cppreference.com, das eine viel bessere und aktuellere Dokumentation des Standards enthält. Dasstdio.h
Äquivalent in C ++ istcstdio
, verwenden Sie das stattdessen. Darüber hinaus ist der Code ziemlich nicht idiomatisch C ++. Ich denke, es wäre viel klarer, wenn Sie separate Lösungen für C und C ++ vorgestellt hätten.Fügen Sie einfach die Standardbibliothek in Ihren Code ein.
Die Arraygröße wird als bezeichnet
n
Dein altes Array
Deklarieren Sie ein neues Array, in das Sie Ihren alten Array-Wert kopieren müssen
Benutze das
quelle
Da Sie zu C ++ wechseln, wird zunächst empfohlen , den Vektor anstelle des herkömmlichen Arrays zu verwenden . Außerdem ist das Kopieren eines Arrays oder Vektors
std::copy
die beste Wahl für Sie.Besuchen Sie diese Seite, um Informationen zur Verwendung der Kopierfunktion zu erhalten: http://en.cppreference.com/w/cpp/algorithm/copy
Beispiel:
quelle