Viele Methoden innerhalb der Template-Klasse vector
erhalten eine konstante Referenz auf value_type
-Objekte, zum Beispiel:
, während resize
den Parameter value_type
nach Wert annimmt:
Als ein nicht-Experte C ++ - Programmierer kann ich nur mit dieser Wahl Nachteile denken (zum Beispiel, wenn size_of(value_type)
groß genug ist, kann Stapelüberlauf auftreten). Was ich Menschen mit mehr Verständnis für die Sprache fragen möchte, ist also:
Was ist das Designprinzip hinter dieser Wahl?
Diese Funktion wurde aus C ++ 11 entfernt .
C ++ 11 hat zwei Überladungen von resize()
:
was ziemlich einfach zu verstehen ist. Der erste verwendet standardmäßig konstruierte Objekte vom Typ value_type
, um den Vektor beim Ändern der Größe zu füllen, der zweite nimmt einen Wert an, aus dem er bei der Größenänderung Kopien erstellt.
Dies scheint ein Konstruktionsfehler zu sein, es wurde jetzt behoben.
Zitieren von STL-Fehlern 679
Der C ++ 98-Standard gibt an, dass eine Mitgliedsfunktion des Containers seinen Parameter (T) nur als Wert anstatt als const-Verweis übergibt:
void resize (Größe_typ sz, T c = T ());
Diese Tatsache wurde im Laufe der Jahre immer wieder diskutiert / debattiert, das erste Mal, bevor C ++ 98 ratifiziert wurde. Der Grund dafür, diesen Parameter als Wert zu übergeben, war:
Damit funktionieren diese Anweisungen, die auf sich selbst beziehen, zum Beispiel:
%Vor%Jedoch ist diese Begründung nicht überzeugend, da die Signatur für push_back lautet:
%Vor%Und push_back hat eine ähnliche Semantik zur Größenanpassung (append). Und push_back muss auch im Fall der Selbstreferenzierung funktionieren:
%Vor%Das Problem bei der Weitergabe von T nach Wert ist, dass es erheblich teurer sein kann als die Weitergabe als Referenz. Das Gegenteil ist auch richtig, wenn es jedoch wahr ist, ist es normalerweise viel weniger dramatisch (z.B. für skalare Typen).
Selbst wenn die Bewegungssemantik verfügbar ist, kann das Übergeben dieses Parameters nach Wert teuer sein. Betrachten Sie zum Beispiel Vektor & gt;:
%Vor%Im pass-by-value-Fall wird x einmal in den Parameter resize kopiert. Und dann intern: Da der Code nicht zur Kompilierzeit wissen kann, um wie viel Größe der Vektor wächst, wird x in der Regel ein zweites Mal aus dem Größenänderungs-Parameter an seine richtige Stelle innerhalb des Vektors kopiert (nicht verschoben).
Mit pass-by-const-reference muss das x im obigen Beispiel nur einmal kopiert werden. In diesem Fall hat x einen teuren Kopierkonstruktor, so dass alle Kopien, die gespeichert werden können, eine erhebliche Ersparnis darstellen.
Wenn wir für push_back effizient sein können, sollten wir auch für die Größenänderung effizient sein. Die Größenanpassung unter Verwendung eines Referenzparameters wurde codiert und in der CodeWarrior-Bibliothek versandt, ohne dass mir Probleme bekannt sind.
Vorgeschlagene Auflösung:
Ändern 23.3.3 [deque], p2:
%Vor%Ändern Sie 23.3.3.3 [deque.capacity], p3:
%Vor%Ändern 23.3.5 [Liste], p2:
%Vor%Ändern Sie 23.3.5.3 [list.capacity], p3:
%Vor%Ändern 23.3.6 [Vektor], p2:
%Vor%Ändern Sie 23.3.6.3 [vector.capacity], p11:
%Vor%
Das funktioniert:
%Vor%Verwenden Sie konvertieren mit Stil 101.
%Vor%Wenn Ihre Spalte wirklich %code% ist, müssen Sie vor dem Konvertieren in datetime
in varchar konvertieren %Vor%Ich habe eine Spalte, die ein Text ist:
Anmerkungen (Text, null)
Ein Beispielwert ist "21.05.2013 09:45:48"
Wie konvertiere ich es in ein Datetime-Format wie dieses: "2013-05-21 09: 45: 48.000"
Der Grund für die Konvertierung ist, dass ich versucht habe, die Gesamtzahl der Stunden zwischen einer Datetime-Spalte und dem Datumsstempel in der Spalte "Bemerkungen" zu ermitteln. Ich dachte an so etwas:
Anmerkungen (Text, null) - Date_Sent (datetime, null)
Um klar zu sein, die Spalten geben das Datum an, an dem eine Anfrage eines Kunden gesendet wurde (Date_Sent) und die letzte Antwort eines Vertreters bezüglich der Anfrage (Response), also für eine Probe eines Date_Sent mit einem Wert von "2013 -05-21 08: 00: 00.000 "und eine Antwort mit einem Wert von" 21.05.2013 10:00:00 "sollte ich einen Wert von 2,00 (2 Stunden) bekommen. In der Datenbank, an der ich gerade arbeite, sind Bemerkungen ein Text und Date_Sent ist ein Datetime.
Ich bin etwas neu in SQL, also brauche ich wirklich Hilfe bei diesem :( TIA!
Formatieren Sie in SQL Server Text als datetime
%Vor%