2014-09-28 15 views
6

Ich habe eine vector<T, alloc> wo alloc ist ein einfacher Wrapper auf std::allocator<T>, die einige zusätzliche Buchhaltung führt, wie das Zählen der Anzahl der erstellten Objekte und so.Von einem Vektor mit einem Zuweiser zu einem Vektor mit einem anderen

Jetzt möchte ich von meinem vector<T, alloc> in vector<T> verschieben. Keine der Vektorbewegungsfunktionen scheint vector s mit verschiedenen Zuordnern zu akzeptieren.

Wie kann ich Daten von einem Vektor in einen anderen übertragen, wenn die Zuordnungen nicht übereinstimmen?

+0

Ich denke, was Sie fordern total Sinn macht aber leider ist Vektor so definiert/implementiert, dass dies nicht möglich ist. Ich denke, es ist derzeit nicht möglich, aber es sollte sein. Die einzige Option, an die ich denken kann, ist eine Art von Vektor-Spezialisierung für den speziellen Allokator. – alfC

Antwort

3

Wie John Zwinck in seiner Antwort erklärt, können Sie den Vektor nicht bewegen. Sie können jedoch die Elemente des Vektors bewegen wie folgt:

vector<...> u; 
... 
vector<...> v(
    std::make_move_iterator(u.begin()), 
    std::make_move_iterator(u.end()) 
); 

oder

vector<...> u; 
vector<...> v; 
... 
v.insert(
    v.end(), 
    std::make_move_iterator(u.begin()), 
    std::make_move_iterator(u.end()) 
); 

oder (vorgeschlagen von Oktalist)

vector<...> u; 
vector<...> v; 
... 
std::move(u.begin(), u.end(), std::back_inserter(v)); 
+0

Das ist ein guter Punkt, obwohl die Art, wie ich die Frage verstanden habe, der Wunsch war, die Vektordaten von einem zum anderen zu bewegen. Zum Beispiel, wenn Sie einen riesigen Vektor von ganzen Zahlen haben, möchten Sie vielleicht vermeiden, sie zu kopieren, womit 'move_iterator' anscheinend nicht hilft. Ich denke, es kommt darauf an, ob der ursprüngliche Grund für die Frage von einem großen Vektor kleiner Objekte herrührt oder umgekehrt. –

+0

@John Zwinck Ich stimme zu. Das ist nicht ganz das, was das OP will, aber vielleicht kann das beste tun. – user763305

+2

'std :: move (u.begin(), u.end(), std :: back_inserter (v));' als Alternative im zweiten Fall. – Oktalist

3

Das ist in der Tat eine seltsame Sache über die STL. Sie müssen insert() die Werte Ihres Quellvektors in Ihren Zielvektor eingeben. Oder können Sie eine von mehreren alternativen-Universum STL-Implementierungen verwenden, die dieses Problem zu beheben direkt, zum Beispiel:

Einige der Leute, die die oben quasi-STL gemacht Implementierungen versucht, ihre allocator Modelländerungen in den C angenommen werden ++ Standard, aber sie waren nicht erfolgreich.

+0

Ich kann sie nicht einfügen(), weil es nicht genügend Sicherheitsgarantien gibt, um den Quellvektor zu löschen und dann die neuen Elemente einzufügen. – Puppy

+0

Was ist dein T? Vielleicht können Sie die andere Antwort hier mit 'move_iterator' betrachten, wenn Ihr T beweglich ist, oder von Quelle zu Ziel wechseln, oder vielleicht sogar überlegen, warum Sie zuerst einen benutzerdefinierten Zuordner benötigen (Sie können Speicherzuweisungsmetriken auf andere Arten bekommen) Plattformen). –

Verwandte Themen