Verschiebe einen VektorT * nach Vektorconst T *

9

Ist es möglich, ein vector<T*> in ein vector<const T*> zu verschieben, ohne es zu kopieren und ohne auf reinterpret_cast<> zu setzen? Ie.

%Vor%     
Timmmm 05.03.2018, 11:26
quelle

2 Antworten

6

Ich werde das aus einem anderen Blickwinkel angreifen. Und auf ein mögliches Designproblem eingehen. Sie haben nicht angegeben, was in ... kommt, aber unter der Annahme, dass get einen Vektor auffüllt und dann zurückgibt, besteht die Lösung meines Erachtens darin, den Code zu heben, der außerhalb von beide liegt Funktionen.

%Vor%

Eine Quelle der Wahrheit für die populierende Logik. Und während die beiden ursprünglichen Funktionen identisch sind, ist es vernachlässigbar. Außerdem wird es bei einer vernünftigen Implementierung keine überflüssigen Kopien machen, weil RVO erstaunlich ist.

    
StoryTeller 05.03.2018, 12:30
quelle
3

Nein.

Obwohl ein T* möglicherweise trivialerweise in ein const T* konvertiert wird, ist ein Container von T* nicht mit einem Container von const T* "verwandt", so dass es einfach keine Funktionalität gibt, um das zu tun, was Sie fragen.

Beachten Sie auch, dass diese Funktionalität hypothetisch int** einem const int** zuweisen kann, was nicht erlaubt ist (es gibt keinen speziellen Fall, wenn der Programmierer diese Zuweisung als Teil einer Swap-Operation durchführen wollte, z soweit ich weiß).

Außerdem würde ein reinterpret_cast nur diese Fakten hacken und Ihrem Programm undefiniertes Verhalten geben.

Sie haben drei Möglichkeiten:

  • Kopieren Sie den Vektor ( O (n) )
  • Machen Sie es so, dass Sie den gewünschten Container an erster Stelle haben ( O (∞) )
  • Machen Sie es so, dass Sie den neuen Containertyp überhaupt nicht benötigen ( O (?) )
quelle

Tags und Links