2014-09-28 28 views
6

ile taşınması vector<T, alloc> var,, std::allocator<T> üzerinde oluşturulan nesnelerin sayısını ve benzerlerini saymak gibi ek bir defter tutma işlemi gerçekleştiren basit bir sarıcıdır.Bir vektörün bir allocator ile başka bir

Şimdi vector<T, alloc> adresinden vector<T> ürününe geçmek istiyorum. Vektör hareket fonksiyonlarının hiçbiri, farklı ayırıcılar ile vector s kabul etmiyor.

Verileri bir vektörden diğerine ayırıcıların aynı olmadığı bir yere nasıl taşıyabilirim?

+0

Ben ne için soruyorsunuz toplam mantıklı düşünmek (Oktalist önerdiği) ama ne yazık ki vektör buna izin vermeyecek şekilde tanımlanmış/uygulanmıştır. Bence şu anda mümkün değil ama olmalı. Düşünebildiğim tek seçenek, özel ayrıştırıcı için bir çeşit vektörün spekülasyonudur. – alfC

cevap

3

John Zwinck'in cevabında açıkladığı gibi, vektörü taşıyamazsınız. aşağıdaki gibi Ancak, vektör öğeleri taşıyabilirsiniz:

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

veya

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

veya

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

Bu, iyi bir nokta, ama soruyu anladığım şekilde, vektör verilerini birinden diğerine taşıma arzusuyla ilgiliydu. Örneğin, büyük bir tamsayı vektörüne sahipseniz, bunları kopyalamaktan kaçınmak isteyebilirsiniz. Bu, 'move_iterator' ile ilgili yardımcı görünmüyor. Sanırım sorunun asıl sebebi, küçük nesnelerden oluşan büyük bir vektörden mi yoksa başka bir yoldan mı geldiğine bağlı. –

+0

@John Zwinck Katılıyorum. OP'nin istediği tam olarak değil, ama belki de en iyisini yapabilir. – user763305

+2

'std :: move (u.begin(), u.end(), std :: back_inserter (v));' ikinci durumda bir alternatif olarak. – Oktalist

3

Bu gerçekten STL hakkında garip bir şey. Kaynak vektörünüzün değerlerini hedef vektörünüze insert() olmalıdır. Yoksa örneğin, doğrudan bu konuyu ele birkaç alternatif-evren STL uygulamalarının birini kullanabilirsiniz: https://github.com/bloomberg/bde/wiki/BDE-Allocator-model:

uygulamaları kendi ayırıcı modeli değişiklikleri C içine kabul olsun çalıştı yukarıdaki yarı-STL yapılan millet bazıları ++ standart ama başarılı olmadılar.

+0

Bunları ekleyemiyorum çünkü(), kaynak vektörünü silmeye ve sonra yeni öğeleri eklemeye yetecek istisna güvenlik garantisi yok. – Puppy

+0

Senin T nedir? Belki de T hareket edemiyorsa, ya da kaynaktan hedefe takas ederse, belki de “move_iterator” kullanarak diğer cevabı düşünebilirsiniz, ya da belki de neden ilk etapta özel bir ayırıcıya ihtiyaç duyduğunuzu yeniden düşünebilirsiniz (bazı durumlarda bellek ayırma metriklerini başka yollarla alabilirsiniz) platformlar). –

İlgili konular