2015-05-05 7 views
7

İki takım var ve bir yineleyici arasında unique_ptr`s:Taşı `<code>a</code> bir elemana setleri

set<unique_ptr<X>> a, b; 
set<unique_ptr<X>>::iterator iter = find something in a; 

ben a dan iter tarafından işaret elemanı çıkarın ve b eklemek için istiyoruz. Mümkün mü? Nasıl?

+0

@black: Soruyu kendi kendine yeten olduğuna inanıyoruz. Eğer cevap verebilecek kadar zekiysen, problemler senin için kendini belli etmeli. Bence – ybungalobill

+0

olsa da, mesele söz konusu belirgin olmalıdır ve en fazla göstermek için bir şey kodlamak için size gerektirmemelidir. Gördüğüm sorun, gördüğünüzden farklı olabilir. Kurduğum şeyle ilgili problemlerim var, peki ya sen? – edmz

+1

@black: Hiçbir şey kodlamanıza gerek yok. Aslında herhangi bir kodu derlemeyi bile denemedim çünkü ekleme ve silme işleminin işe yaramayacağını bilecek kadar iyi biliyorum. sorusu yeterince C++ standardı biliyorum ve gerekenleri başarmak istiyorum std :: set arayüzüne ya da bunların bir kombinasyonu belirli bir bölümüne, beni işaret edebilir olanlara yöneliktir. Soru var ve eğer SO'daki her sorunun derleyici bir hataya dönüştüğünü düşünüyorsanız, sizin için çok kötü. – ybungalobill

cevap

2

Eh, bunu yapmak için hiçbir normal yol yoktur sanıyorum. Ama her zaman vardır normal olmayan bir :) Şunları yapabilirsiniz:

auto tmp = const_cast<std::unique_ptr<std::string>&&>(*iter); 
a.erase(iter); 
b.insert(std::move(tmp)); 

Ok, ilk satırı değişmez set ihlal ve korkunç ama bildiğim kadarıyla anladığım kadarıyla bu bir sorun olmamalı Bir sonraki satırda bu kötü düğümü setten çıkarıyoruz.

+0

Bu, silme sonrasında unique_ptr'yi geçersiz kılmaz mı? –

+0

@TasosVogiatzoglou, hayır yapmayacak. Biz tmp' 've sılme grubu' a' içeren 'hareket-from'' unique_ptr' nesne üzerine a' 'kümesinden nesne taşındı. – ixSci

+0

Oh, tamam. Okurken, silme üzerine silme işleminin yapıldığını düşündüm. –