2013-02-21 32 views

cevap

18

std::move sağlar kullanabilir. Bir dizi değeri taşıdığınızda tasarruf daha da fazla olabilir. Ancak, bir kapsayıcıdan move a range'u yaptığınızda, kapsayıcı hala bir kez bu değerler tarafından işgal edilen yerleri tutar.

Onlardan kurtulmak istiyorsanız, bu yer tutucuları kaldırmak için kabı el ile yeniden boyutlandırmanız gerekir (bu kapsayıcıları diğer öğeler için yeniden kullanmayı tercih etmeniz durumunda). Bunu yapmanın bir yolu, kaptan taşındığınız aralıkta vector::erase'u aramaktır.

+0

iyi cevap; ama ilk vektör dikkat çekicidir, çünkü hareket atama kurucusu çağrılmış, ilk nesneler, bağırsakları söndürmek için bağırsakları söndürmüştür – Gabriel

+1

bir örnek iyi olurdu –

3

Sen bir vektörden gelen düşünüyorsun şekilde elemanlarını hareket edemez:
bu yazdım kodudur Her zaman ilk vektördeki eleman konumlarını silin.

öğesinin tümünü öğesinin tümünü ilk vektörden ikinci ve tam tersi olarak değiştirmek isterseniz swap kullanabilirsiniz. Eğer eleman aynı miktarda hareket ettirmek için iki vektör arasındaki istiyorsunuz

, bir potansiyel olarak daha hızlı işlem hızı sağlayan, kopyalayarak karşıt olarak, nesne hareket swap_ranges

+5

Tabi ki yapabilirsin. Bu, semantiğin tümüyle ilgili olduğu şeydir. –

+0

@ R.MartinhoFernandes Daha net olarak düzenlenmiştir. OP, bir operasyonun iki operasyonda yapması gereken şeyi yapmak isterken, ikincisi her zaman ilk vektörden siliniyordu. – alestanis

37

std::move ve std::copyelemanları değil, kaplar çalışır. Konteynırı ayrı olarak değiştirmek zorundasınız. böylece,

std::vector<Foo> v1, v2; 

// populate v1 with at least 17 elements... 

auto it = std::next(v1.begin(), 17); 

std::move(v1.begin(), it, std::back_inserter(v2)); // ## 

v1.erase(v1.begin(), it); 
hattı ## sonra

, v1 ilk 17 element hala orada, ama onlar "taşındı-dan" oldum: Örneğin, yeni bir vektör v2 içine v1 ilk 17 elemanlarını taşımak için belirsiz bir durumdalar.

+0

Sadece vektör yetkisinin üyesi takas olmaz İşte? –

+0

@IvayloStrandjev: Ne yapmak istediğinize bağlıdır ...Bir segmenti ilk vektörün ortasından taşımak istiyorsanız, takasın nasıl avantajlı olacağını göremiyorum. –

+0

@IvayloStrandjev ile değiştirin * what *? Bir delik dolduruyorsun; hediye alışverişinde bulunmamak. Ya da kavramı anlayamıyorum (cehennemin, kafeinim olmadan bu çiş saatinde onun bir mucizesi Kerrek'in görevini anlıyorum). Düzenleme: Tamam. Mesajını görüyorum. * şimdi * Anladım * her iki * kavram. – WhozCraig

2

Eski bir parçacığı diriltmek, ama hiç kimse insert ile kombine std::make_move_iterator bahsetti şaşırıyorum. Bu hedef vektör içerisinde preallocating alanı önemli performans yararı vardır: Diğerleri işaret gibi

, ilk vektör v1 belirsiz durumda şimdi
v2.insert(v2.end(), std::make_move_iterator(v1.begin() + 7), 
        std::make_move_iterator(v1.end())); 

, bu nedenle karışıklık temizlemek için erase kullanın:

v1.erase(v1.begin() + 7, v1.end()); 
+0

@Caleth Hiç kimsenin fark etmeyeceğini düşündüm :) Güncelleme, teşekkürler. –

İlgili konular