क्या मुझे वास्तव में एक लैम्ब्डा में 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));
चूंकि यह पूछा गया था, आपके द्वारा काम करने के लिए मूल प्रस्ताव के लिए मजबूर सकता है
आप क्या हैं आर प्राप्त करने की कोशिश कर रहा है? इस मामले में यह केवल std :: copy या std :: vector dstData (srcData.begin(), srcData.end()) का उपयोग करने के लिए पर्याप्त नहीं है? –
kyku
दूसरा। इसके अतिरिक्त, लैम्बडा के बिना आपने जो कुछ करने की कोशिश की वह std :: move के वापसी मूल्य का पता ले रहा है, जो वास्तव में एक अस्थायी की तरह कार्य करता है। एक अस्थायी का पता लेना हमेशा एक बुरा विचार है। – Bob
@kyku बिंदु स्पष्ट रूप से * तारों को कॉपी करने से बचने के लिए है, बजाय स्ट्रिंग को स्थानांतरित करना। Std :: स्ट्रिंग को कैसे कार्यान्वित किया जाता है, इस पर निर्भर करते हुए, इसका एक बड़ा प्रदर्शन लाभ हो सकता है। – wolfgang