उपयोग drain
कई सन्निहित तत्वों संभव के रूप में एक ही बार में के रूप में कुशलता से एक वेक्टर से दूर करने के लिए (implementationptr::copy
का उपयोग करता तत्वों है कि रहने के ले जाने के लिए):
let mut v = vec![1, 2, 3, 4];
v.drain(0..2);
assert!(v == vec![3, 4]);
# 2 के बारे में, यह है शेष तत्वों को स्थानांतरित करने से बचने के लिए व्यवहार्य नहीं है। उस अनुकूलन के लिए वेक्टर के प्रतिनिधित्व में परिवर्तन, आवंटकों में परिवर्तन, या दोनों के लिए परिवर्तन की आवश्यकता होगी, और सभी उपयोग के मामले में वेक्टर को कवर करने के लिए डिज़ाइन नहीं किया गया है। यदि आपको सामने से कुशल हटाने की आवश्यकता है, तो VecDeque
का उपयोग करें।
Vec
एक ट्रिपल < pointer-to-first-element, capacity, length > शामिल का प्रतिनिधित्व करती है। यदि आगे से हटाने से शेष सूचकों को प्रारंभ पॉइंटर आगे ले जाकर बचाया जाता है, तो डीलोकेशन क्रैश हो जाएगा क्योंकि स्टार्ट पॉइंटर अब आवंटक द्वारा प्रदान नहीं किया जाएगा। या तो वेक्टर को "मूल सूचक" के लिए एक नया क्षेत्र प्राप्त करने की आवश्यकता होगी, जो सभी वैक्टर ऑप्टिमाइज़ेशन के लिए भुगतान करेगा, या आवंटन इंटरफेस को ब्लॉक की शुरुआत को मुक्त करने के लिए एक विधि के साथ विस्तारित करने की आवश्यकता होगी। प्रत्येक फ्रंट हटाने को आवंटक में कॉल किया जाएगा, जिसमें निष्पादन के परिणाम होंगे जो मूल्यांकन करने में कठोर हैं, यह देखते हुए कि आवंटक को अपनी स्वयं की बहीखाता और संभवतः लॉक प्राप्त करना होगा। यह आवंटकों को बोझ भी जोड़ देगा, इसे मूल रूप से वितरित किए गए ब्लॉक से पहले इन संभावित छोटे अनलाइन किए गए मुक्त ब्लॉक का ट्रैक रखने की आवश्यकता होगी। यह वैक्टर को लगभग सभी मूल आवंटकों जैसे malloc()
और mmap()
के साथ असंगत बना देगा।
अंत में, अनुकूलन वर्तमान में Vec
द्वारा प्रदान की गई गारंटीओं का खंडन करेगा। प्रलेखन explicitly states जो Vec
को कम करने से इसकी क्षमता कम नहीं करेगा या इसे हटाएगा, जब तक कि shrink_to_fit
पर कॉल न किया जाए। यह वेक्टरों के लिए अत्यधिक आवंटन से बचने के लिए है जो बहुत कम हो जाते हैं और बढ़ते हैं।
ध्यान दें कि यह प्रश्न http://stackoverflow.com/questions/28952411 के समान है - केवल यह अंत के बजाय वेक्टर की शुरुआत के बारे में पूछता है। – ideasman42