Wenn Sie fragen, wie ein const-Vektor so initialisiert werden soll, dass er interessante Inhalte enthält, besteht die Antwort wahrscheinlich darin, den Kopierkonstruktor zu verwenden. Zuerst füllen Sie mühsam einen Vektor aus, dann erstellen Sie daraus Ihren neuen const-Vektor. Oder Sie können die vector<InputIterator>(InputIterator, InputIterator)
Konstruktorvorlage verwenden, um aus einem anderen Container oder Array zu initialisieren. Wenn es sich um ein Array handelt, könnte dies mit einer Initialisierungsliste definiert worden sein.
So etwas ist hoffentlich nah an dem, was Sie wollen:
const T ra[3] = {t1, t2, t3};
const vector<const T> v(ra, ra+3);
Wenn Sie fragen, wie ein konstanter Vektor an eine Funktion übergeben werden soll, die einen Vektor akzeptiert, lautet die Antwort entweder:
- Sie können nicht, weil die Funktion den Vektor ändern könnte und Ihr Objekt / Ihre Referenz const ist. Erstellen Sie eine nicht konstante Kopie des Originals und geben Sie diese weiter.
oder
- Verwenden Sie
const_cast
diese Option, um die Konstanz zu entfernen und sie an eine Funktion zu übergeben, die einen Nicht-Konstanten-Vektor verwendet, von der Sie jedoch zufällig wissen, dass sie den Vektor nicht ändert.
Letzteres ist eines der Dinge, die zu Recht dazu führen, dass jeder, der es sieht, Kommentare zu Schutzbrillen abgibt und dass sie nichts tun. Es ist genau das, wofür es const_cast
ist, aber es gibt ein ziemlich starkes Argument, das besagt, dass const_cast
Sie bereits verloren haben , wenn Sie es brauchen .
Beides zu tun (mit dem Kopierkonstruktor einen konstanten Vektor aus einem nicht konstanten Vektor zu erstellen und dann die Konstanz wegzuwerfen) ist definitiv falsch - Sie sollten nur einen nicht konstanten Vektor verwenden. Wählen Sie also höchstens eines davon aus, um es zu tun ...
[ Bearbeiten: habe gerade bemerkt, dass Sie über einen Unterschied zwischen vector<T>
und sprechen const vector<const T>
. Leider in der STL, vector<const T>
und vector<T>
sind völlig unabhängige Typen, und die einzige Möglichkeit, zwischen ihnen zu konvertieren, ist durch Kopieren. Dies ist ein Unterschied zwischen Vektoren und Arrays - a T**
kann lautlos und sicher in const T *const *
] konvertiert werden