constante String im Vektor

BLR

Erfahrenes Mitglied
Hallo,

ich habe einige Stringwerte, die zur Laufzeit des Programms sich nicht ändern sollen. Diese halte ich in einem Vector. Nun möchte ich sie als const definieren. Später gebe ich sie in einer Const-Methode aus.

Das klappt leider nicht und ich find mein Fehler nicht:

Klassendifinition:

C++:
#include <vector>
#include <string>
using std::vector;
using std::string;
class testConst {
public:
    testConst();
    testCosnt(vector<const string>& k);
    testConst(const testConst& orig);
    virtual ~testConst();
private:

    vector<const string> keys;
 
};

Der Konstruktor in der cpp-Datei:

C++:
testConst::testCosnt(vector<string>& k){
    for (int i = 0; i < k.size(); i++) {     
        this->keys.push_back(k.at(i));
    }
}

Die Main:
C++:
int main(int argc, char** argv) {

    const string daa("asdfd");
    vector<const string> test;
  
    test.push_back(daa);
    test.push_back(daa);
    test.push_back(daa);
    test.push_back(daa);
  
    testConst tC(test);
  
    return 0;
}

Eigentlich habe ich ein größeres Projekt, wo das nicht funktioniert.
Da habe ich ein kleines Testprojekt hier angelegt und schon sagt er mir sogar in der Main, dass man

vector<const string> vk

so nicht definieren darf, obwohl er mir das in meinem eigentlich Projekt nicht anmeckert.
In meinem eigentlichen Projekt meckert er nur an der Stelle, wo ich das im Konstruktor mit dem Argument
vector<const string>&k übergeben will:

this->keys.push_back(k.at(i));


Weiss nicht so recht, was da falsch sein soll.

Danke für jeden Tipp
 
Zuletzt bearbeitet:
Hallo BLR

Siehe C++-Standard Kapitel "23.2.4 Class Template vector" im zweiten Abschnitt:
In addition to the requirements on the stored object described in 23.1, the stored object shall meet the requirements of Assignable

Viele Grüsse
Cromon
 
Der Zusammenhang mit diesem Problem erschließt sich mir nicht ganz^^
Freiübersetzt:
Zusätzlich zu den Anforderungen zu den Objekten in 23.1, soll die Zuweisbar sein.....

Was hat das mit meinem Problem zu tun??^^
Wäre const vector<string> gleichwertig???
 
Hallo BLR

Nein, const std::vector<std::string> und std::vector<const std::string> sind nicht das gleiche.

Der Zusammenhang zu deinem Problem ist simpel: das Element, das in deinem Vektor ist muss zuweisbar sein. const T ist nicht zuweisbar, das ist ja der Sinn des "const".

Viele Grüsse
Cromon
 
Hhhmm....ja stimmt^^
und was ist mit const vector<string>???
Irgendwie kann ich sie nicht als Membervariable definieren.

error: declaration does not declare anything [-fpermissive]
 
Nun, weshalb willst du denn einen const vector?

Falls du wirklich konstante Werte haben willst, ist der std::vector eine schlechte Wahl. C-Arrays oder sogar defines wären besser geeignet, da die Reallokationsfunktionen des Vektor ja sowieso nicht gebraucht werden.
 
Vielen Dank für die Info.
Ich finde diesen Punkt sehr interessant, wieso Vector keine gute Wahl dafür wäre.
Welches STL-Container wäre dafür besser geeignet.
Als Zusammenfassung:
Beim constanter Vector bzw. constante Elemente im Vector sind nicht zugelassen.

Danke
 
Welches STL-Container wäre dafür besser geeignet.
Ist das eine Frage?
Wikipedia hat gesagt.:
  • Initialisation of STL containers with constants within the source code is not as easy as data structures inherited from C (addressed in C++11 with initializer lists).
http://en.wikipedia.org/wiki/Standard_Template_Library

Falls du wirklich Vektoren verwenden willst, warum nicht einfach "normale" Datentypen ohne "const"?

http://stackoverflow.com/questions/6819699/const-vector-of-non-const-objects

Ohne das genaue Projekt zu kennen, ist es schwierig, Lösungsansätze zu finden. Wofür brauchst du den Vektor denn?

Gruss
cwriter
 
Ja, ich hab einfach n String-Werte, die ich irgendwie ablegen muss.
Ja, ich verwende nun normal vector<String>.

Mir ist leider nicht ganz klar, wann es sinnvoll ist, den vector zu verwenden oder wann eine List.
Letztendlich will man so oder so Daten darin ablegen, auf sie zugreifen, sortieren oder löschen.
 
Der Hauptunterschied ist, dass das Einfügen von Elementen beim Vektor sehr langsam werden kann,
vor allem wenn sehr viele Elemente drin sind (ab und zu muss beim Wachsen neu allokiert werden, und je nachdem,
an welche Position man einfügt, muss uU. jedes vorhandene Element verschoben werden)

und bei der Liste das EInfügen zwar immer schnell ist, aber allein der Zugriff auf Index xy bzw.
das Finden davon je nach Elementanzahl relativ lang dauern kann.

Hier eine ausführlichere Liste: http://stackoverflow.com/a/2209564/3134621
 

Neue Beiträge

Zurück