In Richtung Bradgonesurfing Antwort, hat oft ein nicht wirklich braucht zwei Vektoren verketten (O (n)), sondern nur mit ihnen arbeiten , als ob sie verkettet wurden (O (1)) . Wenn dies der Fall ist, können Boost-Bibliotheken benötigt werden.
Der Trick besteht darin, einen Vektor-Proxy zu erstellen: eine Wrapper-Klasse, die Verweise auf beide Vektoren manipuliert , die extern als ein einziger zusammenhängender Vektor betrachtet werden .
VERWENDUNG
std::vector<int> A{ 1, 2, 3, 4, 5};
std::vector<int> B{ 10, 20, 30 };
VecProxy<int> AB(A, B); // ----> O(1). No copies performed.
for (size_t i = 0; i < AB.size(); ++i)
std::cout << AB[i] << " "; // 1 2 3 4 5 10 20 30
IMPLEMENTIERUNG
template <class T>
class VecProxy {
private:
std::vector<T>& v1, v2;
public:
VecProxy(std::vector<T>& ref1, std::vector<T>& ref2) : v1(ref1), v2(ref2) {}
const T& operator[](const size_t& i) const;
const size_t size() const;
};
template <class T>
const T& VecProxy<T>::operator[](const size_t& i) const{
return (i < v1.size()) ? v1[i] : v2[i - v1.size()];
};
template <class T>
const size_t VecProxy<T>::size() const { return v1.size() + v2.size(); };
Hauptnutzen
Es ist O (1) (konstante Zeit), um es zu erstellen, und mit minimaler zusätzlicher Speicherzuweisung.
EINIGES PERSONAL ZU ÜBERLEGEN
- Sie sollten es nur versuchen, wenn Sie wirklich wissen, was Sie im Umgang mit Referenzen tun . Diese Lösung ist für den spezifischen Zweck der gestellten Frage gedacht, für die sie ziemlich gut funktioniert . Die Verwendung in einem anderen Kontext kann zu unerwartetem Verhalten führen, wenn Sie nicht sicher sind, wie Referenzen funktionieren.
- In diesem Beispiel stellt AB keinen nicht konstanten Zugriffsoperator ([]) bereit. Fühlen Sie sich frei, es einzuschließen, aber denken Sie daran: Da AB Referenzen enthält, wirkt sich das Zuweisen von Werten auch auf die ursprünglichen Elemente in A und / oder B aus. Ob dies eine wünschenswerte Funktion ist oder nicht, es ist eine anwendungsspezifische Frage, die Sie stellen sollten sorgfältig überlegen.
- Alle Änderungen, die direkt an A oder B vorgenommen werden (wie das Zuweisen von Werten, Sortieren usw.), "modifizieren" auch AB. Dies ist nicht unbedingt schlecht (tatsächlich kann es sehr praktisch sein: AB muss niemals explizit aktualisiert werden, um sich selbst mit A und B synchron zu halten), aber es ist sicherlich ein Verhalten, das man beachten muss. Wichtige Ausnahme: Wenn Sie die Größe von A und / oder B auf etwas Größeres ändern , werden diese möglicherweise im Speicher neu zugewiesen (für den Bedarf an zusammenhängendem Speicherplatz), was wiederum AB ungültig macht.
- Da jedem Zugriff auf ein Element ein Test vorausgeht (nämlich "i <v1.size ()"), ist die VecProxy-Zugriffszeit, obwohl sie konstant ist, auch etwas langsamer als die von Vektoren.
- Dieser Ansatz kann auf n Vektoren verallgemeinert werden. Ich habe es nicht versucht, aber es sollte keine große Sache sein.