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
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
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
@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