मान लीजिए कि आप प्रकार std::vector<std::string>
के एक चर है और आप एक प्रारंभकर्ता सूची के साथ यह प्रारंभ करते हैं:प्रारंभकर्ता_सूची के तत्वों को कैसे स्थानांतरित करें?
using V = std::vector<std::string>;
V v = { "Hello", "little", "world", "of", "move", "semantics" };
संकलक प्रत्येक स्ट्रिंग शाब्दिक के लिए एक अस्थायी std::string
पैदा करेगा, इन पर एक प्रारंभकर्ता सूची बनाने और उसके बाद ctor फोन V
के लिए और वेक्टर बनाएं। सीटीओआर को पता नहीं है कि ये सभी तार अस्थायी हैं, इसलिए प्रत्येक स्ट्रिंग कॉपी कर रहा है।
मुझे मानक में कुछ भी नहीं मिला है जो वेक्टर सीटर को अस्थायी होने पर तत्वों को स्थानांतरित करने की अनुमति देता है।
क्या मुझे कुछ याद आ रहा है या प्रारंभकर्ता सूचियों का उपयोग करके अनावश्यक प्रतियों का कारण बनता है? मैं कक्षाएं लिख रहा हूं जहां यह समस्या महत्वपूर्ण अक्षम कोड का कारण बन सकती है। अनावश्यक प्रतियों से बचने के लिए कोई भी तकनीक की सराहना की जाएगी।
अच्छा प्रश्न है। मुझे नहीं लगता कि प्रारंभकर्ता सूची मूल रूप से * इरादा * कुछ भी करने के लिए थीं लेकिन आसपास के अस्थायी लोगों के अनुक्रम को पास करती थीं। लेकिन अब आप एक प्रारंभकर्ता सूची चर घोषित कर सकते हैं। यह एक लंबे समय तक रहने वाली सूची में प्रत्येक आइटम से बाहर निकलने के लिए एक वेक्टर के लिए नहीं होगा। लेकिन प्रतीक्षा करें, प्रारंभिक सूची में रैवल्यू रेफरी के साथ निर्माता। शायद? –
@ चीयर्संधथ.-एल्फ मुझे लगता है कि मैं कॉन्स्ट-रेफ, गैर-कॉन्स्ट-रेफ और रावल्यू-रेफ द्वारा प्रारंभिक सूची में ओवरलोड कर सकता हूं। मैं तत्वों को मैन्युअल रूप से रैवल्यू-रेफरी प्रारंभकर्ता सूची से स्थानांतरित कर सकता हूं। सुरुचिपूर्ण नहीं है और एसटीएल कंटेनरों के साथ काम नहीं करता है जो मैं वर्तमान में अंतर्निहित भंडारण (वेक्टर और मानचित्र) के रूप में उपयोग कर रहा हूं लेकिन कुछ भी नहीं। धन्यवाद। –
[प्रारंभकर्ता \ _list और सैमसंगिक्स को स्थानांतरित करें] का डुप्लिकेट (https://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics) –