2011-12-15 12 views
9

क्या मुझे वास्तव में एक लैम्ब्डा में std :: move call encapsulate करना है?क्या वास्तव में यहां एक लैम्ब्डा के अंदर std :: move डालना है?

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(); 

मैं अभी भी lambdas और rvalue संदर्भ नया हूँ, इसलिए शुरू में मैंने कोशिश की:

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

जो काम नहीं करता।

क्या मुझे इस कदम को लैम्ब्डा के अंदर रखना है, या क्या मुझे कुछ याद आ रही है?

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

या move एल्गोरिथ्म का उपयोग करें::

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

चूंकि यह पूछा गया था, आपके द्वारा काम करने के लिए मूल प्रस्ताव के लिए मजबूर सकता है

+1

आप क्या हैं आर प्राप्त करने की कोशिश कर रहा है? इस मामले में यह केवल std :: copy या std :: vector dstData (srcData.begin(), srcData.end()) का उपयोग करने के लिए पर्याप्त नहीं है? – kyku

+0

दूसरा। इसके अतिरिक्त, लैम्बडा के बिना आपने जो कुछ करने की कोशिश की वह std :: move के वापसी मूल्य का पता ले रहा है, जो वास्तव में एक अस्थायी की तरह कार्य करता है। एक अस्थायी का पता लेना हमेशा एक बुरा विचार है। – Bob

+3

@kyku बिंदु स्पष्ट रूप से * तारों को कॉपी करने से बचने के लिए है, बजाय स्ट्रिंग को स्थानांतरित करना। Std :: स्ट्रिंग को कैसे कार्यान्वित किया जाता है, इस पर निर्भर करते हुए, इसका एक बड़ा प्रदर्शन लाभ हो सकता है। – wolfgang

उत्तर

12

एक वैकल्पिक कदम iterators उपयोग करने के लिए है :

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

आपको अभिशाप, बस इस सवाल की खोज करते समय मैं वही चाहता था जो मैं चाहता था! : पी – Xeo

+0

@Xeo: मैं 'move' पर रहता हूं ... –

+1

अच्छा उत्तर +1। लेकिन मैं अभी भी जानना चाहूंगा कि 'std :: move 'क्यों गुजर रहा है क्योंकि चौथा पैरामीटर काम नहीं करता है, ऐसा लगता है कि ऐसा होना चाहिए। –

संबंधित मुद्दे