Erstellen Sie eine feste Größe std :: vector und schreiben Sie in die Elemente

8

In C ++ möchte ich eine feste Größe (aber zur Laufzeit bestimmte Größe) std :: vector zuweisen und dann auf die Elemente in diesem Vektor schreiben. Dies ist der Code, den ich verwende:

%Vor%

Dies gibt mir jedoch einen Compilerfehler (MSVC 2010 Pro):

  

Fehler C2440: 'Initialisierung': Konvertierung von 'const int' nach 'int & amp;' Die Conversion verliert Qualifier.

Mein Verständnis von const ist, dass es alle Elementvariablen einer Klasse konstant macht. Zum Beispiel funktioniert Folgendes gut:

%Vor%

Es würde also scheinen, dass std :: vector die const-ness des Containers an die Elemente des Vektors weitergibt, was seltsam erscheint, denn wenn ich die Elemente const hätte, hätte ich std::vector<const int> benutzt. Dies erscheint mir daher als ein Mangel von std :: vector.

Wie kann ich in jedem Fall einen std :: -Vektor erstellen, dessen Größe nach der Konstruktion nicht geändert werden kann, in dessen Elemente aber geschrieben werden kann?

    
user664303 05.04.2013, 11:09
quelle

3 Antworten

11

Dies ist nicht möglich, ohne eine eigene Wrapperklasse zu schreiben. Wenn Sie eine einfache std::vector verwenden möchten, müssen Sie sich auf die Selbstdisziplin verlassen, indem Sie die Memberfunktionen insert() , push_back() oder emplace_back() entweder direkt oder indirekt (z. B. über back_inserter ) nicht verwenden.

Beachten Sie, dass es einen aktuellen Vorschlag für dynamische Arrays für den neuen C ++ 14 Standard:

  

[...] schlagen wir vor, eine neue Einrichtung für Arrays zu definieren, wo die Anzahl von   Elemente sind bei der Konstruktion gebunden. Wir nennen diese dynamischen Arrays,   Dynarray.

Der Vorschlag enthält eine Referenzimplementierung, die Sie in Ihrem eigenen Code verwenden können (stellen Sie sicher, dass namespace std vorläufig in etwas anderes geändert wird).

%Vor%     
TemplateRex 05.04.2013, 11:12
quelle
1

Der eigentliche Fehler liegt darin, dass Sie den Vektor als Konstante deklarieren, was bedeutet, dass Sie den Inhalt niemals ändern können.

Wenn Sie dann versuchen, einen nicht konstanten Verweis auf einen Eintrag im Vektor zu erhalten, sagt Ihnen der Compiler, dass Sie das nicht tun können, weil Sie dann den im Vektor gespeicherten Konstantenwert ändern können.

Um einen Vektor mit einer Größe zu erstellen, die zur Laufzeit festgelegt werden kann, aber nach dem Erstellen des Vektors die Größe nicht ändert, müssen Sie einen Containeradapter erstellen. Grundsätzlich müssen Sie einen Wrapper um einen anderen Container erstellen, wie z. std::stack tut das.

    
Some programmer dude 05.04.2013 11:13
quelle
1

Die direkte Antwort ist, dass Sie das nicht tun können: Sie können den Vektor nicht als const definieren und dann Mitglieder hinzufügen.

Wie andere darauf hingewiesen haben, bietet der neue Standard die Array-Klasse, die wahrscheinlich besser für das geeignet ist, was Sie tun.

Wenn Sie an einer festen Länge interessiert sind, ist die am meisten verwandte Methode in Vektor, an der Sie interessiert sein können, reserve() , was die vector<> auf die Größe des gegebenen Parameters setzt, was Vektorerweiterungen unnötig macht.

Wenn Sie Std C ++ 11 nicht verwenden können, müssen Sie eine Wrapper-Klasse erstellen, mit der Sie den Vektor nicht ändern können. Zum Beispiel:

%Vor%

Hoffe, das hilft.

    
Baltasarq 05.04.2013 11:24
quelle