2011-12-15 23 views
9

Std :: move çağrısını lambda'da gerçekten kapsüllemeli miyim?std :: put gerçekten bir lambda içinde hareket ediyor mu?

std::list<std::wstring>  srcData = GetData(); // implementation not important 
std::vector<std::wstring> dstData; 
dstData.reserve(srcData.size()); 
std::transform(std::begin(srcData), std::end(srcData), std::back_inserter(dstData), 
    [](std::wstring& guid) -> std::wstring { return std::move(guid); }); 
srcData.clear(); 

Öyle başlangıçta Denedim, hala lambdas ve rvalue referanslarına yeni duyuyorum:

std::transform(std::begin(srcData), std::end(srcData), 
    std::back_inserter(dstData), &std::move<std::wstring>); 

çalışmaz hangi.

Hareketi bir lambdaya koymak zorunda mıyım yoksa açık bir şey eksik mi?

std::vector<std::wstring> dstData(std::make_move_iterator(srcData.begin()), 
            std::make_move_iterator(srcData.end())); 

Ya move algoritma kullanıyoruz:

std::move(srcData.begin(), srcData.end(), std::back_inserter(dstData)); 
o istendi yana

, burada çalışmak için özgün öneriyi zorlayacağını nasıl

+1

Neyin var? r elde etmeye çalışıyor? Bu durumda sadece std :: copy veya std :: vector dstData (srcData.begin(), srcData.end()) kullanmak yeterli değil mi? – kyku

+0

2nd that. Ayrıca, lambda olmadan da yapmaya çalıştığınız şey, std :: move'in dönüş değeri olarak ele alınacak ve bu da tam olarak bir geçici gibi davranıyor. Geçici bir adres almak her zaman kötü bir fikirdir. – Bob

+3

@kyku Önemli olan nokta, dizeleri hareket ettirmek yerine dizeleri kopyalamaktan kaçınmaktır. Std :: string'in nasıl uygulandığına bağlı olarak, bu büyük bir performans avantajına sahip olabilir. – wolfgang

cevap

12

alternatif hareket yineleyiciler kullanmaktır :

int main() 
{ 
    std::transform(std::begin(srcData), 
     std::end(srcData), 
     std::back_inserter(dstData), 
     static_cast<std::wstring&&(*)(std::wstring&)>(&std::move<std::wstring&>)); 
} 
+0

Lanet olsun, bu soruyu keşfettiğimde tam olarak ne istediğimi gönderiyorum! : P – Xeo

+0

@Xeo: Yaşamak için yaşıyorum ... –

+1

İyi cevap +1. Ama yine de dördüncü parametre çalışmadığı için std :: move 'nı geçmenin neden olduğunu bilmek isterdim, olması gerektiği gibi görünüyor. –

İlgili konular