Was ist die Design-Grundidee hinter der Resize-Methode von std :: vector?

8

Viele Methoden innerhalb der Template-Klasse vector erhalten eine konstante Referenz auf value_type -Objekte, zum Beispiel:

%Vor%

, während resize den Parameter value_type nach Wert annimmt:

%Vor%

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?

    
Massimiliano 15.05.2013, 16:02
quelle

2 Antworten

9
%Vor%

Diese Funktion wurde aus C ++ 11 entfernt .

C ++ 11 hat zwei Überladungen von resize() :

%Vor%

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.

    
Nawaz 15.05.2013, 16:05
quelle
6

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%
    
taocp 15.05.2013 16:12
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ answer35886012 ___

Das funktioniert:

%Vor%     
___ answer16663146 ___

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%     
___ tag123sqlserver ___ Microsoft SQL Server ist ein relationales Datenbankverwaltungssystem (RDBMS). Verwenden Sie dieses Tag für alle SQL Server-Editionen, einschließlich Compact, Express, Azure, Fast-Track, APS (früher PDW) und Azure SQL DW. Verwenden Sie dieses Tag nicht für andere Arten von DBMS (MySQL, PostgreSQL, Oracle usw.). Verwenden Sie dieses Tag nicht für Probleme bei der Software- und mobilen Entwicklung, es sei denn, es steht in direktem Zusammenhang mit der Datenbank. ___ tag123datetime ___ Ein DateTime-Objekt beschreibt in vielen Programmiersprachen ein Datum und eine Uhrzeit. Je nach dem Kontext, in dem es verwendet wird, und der spezifischen Implementierung kann es entweder einen Zeitpunkt oder eine Position in einem Kalender ausdrücken. Dieses Tag kann für alle Probleme mit Datum und Uhrzeit verwendet werden. ___ tag123sqlserver2008 ___ Verwenden Sie dieses Tag für Fragen, die für die 2008-Version von Microsoft SQL Server spezifisch sind. ___ tag123text ___ Text ist eine Zeichenfolge, die am häufigsten verwendet wird, um zusammenhängende Informationen darzustellen. ___ qstntxt ___

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!

    
___ answer16661974 ___

Formatieren Sie in SQL Server Text als datetime

%Vor%     
___