C ++ äquivalent für memset auf char *

7

Ich habe diesen Code

%Vor%

Ich verstehe, dass es ein Nein ist, memcpy und memset zu verwenden, aber ich habe nicht genau verstanden, wie man das in C ++ verwendet, vorzugsweise ohne Std.

Weiß jemand das? Danke.

    
Para 24.01.2010, 22:26
quelle

7 Antworten

-1
%Vor%

Ich verstehe das jetzt, wollte nur diesen Code für alle zukünftigen Besucher einfügen Die kommentierten Zeilen entsprechen den unkommentierten Zeilen darunter. C kommentiert, C ++ unkommentiert.

    
Para 25.01.2010, 19:28
quelle
8

Im Allgemeinen gibt es std::fill . Ссылка

Oder in diesem speziellen Fall sollten Sie in Betracht ziehen, std::vector<char> zu verwenden.

(Beachten Sie, dass memset weiterhin in C ++ verwendet werden kann, wenn Sie #include <cstring> verwenden, obwohl es in C ++ weniger idiomatisch ist.)

    
jamesdlin 24.01.2010 22:31
quelle
7

Ein möglicher Ersatz für memset bei einem Array von Objekttypen ist die Verwendung des Algorithmus std::fill . Es funktioniert mit Iterator-Bereichen und auch mit Zeigern in Arrays.

memcpy Aufrufe können normalerweise durch Aufrufe von std::copy ersetzt werden.

z.B.

%Vor%

memset und memcpy sind immer noch da und können bei Bedarf verwendet werden. Es ist wahrscheinlich ein größeres No-No aus der Sicht vieler C ++ - Entwickler, ein rohe new zu verwenden und kein ressourcenverwaltendes Objekt zu verwenden. Es ist viel besser, ein std::string oder ein std::vector<char> zu verwenden, so dass die Speicherfreigabe automatisch erfolgt und der Code ausnahmslos sicherer ist.

    
Charles Bailey 24.01.2010 22:29
quelle
2
  

Ich verstehe, dass es ein Nein ist, memcpy und memset zu verwenden, aber ich habe nicht genau verstanden, wie man das in C ++ verwendet, vorzugsweise ohne Std.

Es ist nicht no-no, memcpy und memset zu verwenden, wenn ihre Verwendung angemessen ist. Warum sollte es sein?

Es gibt std::copy in C ++, das einen Satz von Elementen von einem Iterator in einen anderen kopiert (funktioniert in jedem Typ und nicht nur in char* ).

    
Mehrdad Afshari 24.01.2010 22:31
quelle
2

Abgesehen von der Unannehmlichkeit, manuell kopieren zu müssen und die gesamte Speicherzuordnung selbst vorzunehmen, ist dieser C ++ - Code nicht falsch.

Ich würde jedoch die Verwendung von std::string für die String-Manipulation in C ++ dringend empfehlen.

    
Greg Hewgill 24.01.2010 22:32
quelle
1

Wenn Sie nur eine String-Manipulation durchführen, verwenden Sie string.

    
ergosys 24.01.2010 22:30
quelle
1

Um von a nach b zu kopieren, nehmen Sie std::copy(src_start,src_end,dest_start) , was src_start inkrementiert, und kopiert es zum nächsten Zielelement, bis src_start==src_end erreicht ist.

%Vor%

.. außer es funktioniert auch für Nicht-PODs, und Sie müssen nicht mit Byte-Längen verwirren, wenn ein einzelnes Element mehr als ein Byte ist.

Wenn Sie jedoch nur eine Zeichenfolgenmanipulation durchführen möchten, wird die std::string -Klasse (und std::wstring für breite Zeichenfolgen) bereitgestellt. Verkettung ist so einfach wie:

%Vor%

Nichts hält Sie davon ab, die strxxx -Familie von Funktionen in C ++ zu verwenden, aber ich würde Ihnen wärmstens empfehlen, zu std::string und Rest der STL zu wechseln. Es ist auch nicht perfekt, aber viel weniger fehleranfällig.

    
Alexander Gessler 24.01.2010 22:33
quelle

Tags und Links