2011-12-07 13 views
11

std::vector<std::unique_ptr<SomeType> > को देखते हुए, क्या यह remove_if का उपयोग करने के लिए कानूनी है? दूसरे शब्दों में, इस कोड को दिए गए:क्या आप `std :: unique_ifr 'के कंटेनर पर` std :: remove_if` का उपयोग कर सकते हैं?

std::vector<std::unique_ptr<SomeType> > v; 
// fill v, all entries point to a valid instance of SomeType... 
v.erase(std::remove_if(v.begin(), v.end(), someCondition), v.end()); 

, मैं मिटा है कि अभी भी v में सभी संकेत मान्य हैं के बाद की गारंटी कर रहा हूँ। मुझे पता है कि std::remove_if के सहज कार्यान्वयन को देखते हुए, और मैंने देखा है कि सभी कार्यान्वयन, वे होंगे। मैं जानना चाहता हूं कि मानक में कुछ भी है जो इसकी गारंटी देता है; यानी std::remove_if को कॉपी करने की अनुमति नहीं है, इसकी वैध प्रविष्टियों को प्रतिलिपि के बिना अपने अंतिम स्थान पर कॉपी किए बिना।

(मैं निश्चित रूप से कर रहा हूँ,, मान कि हालत नकल नहीं है, तो हालत की तरह एक हस्ताक्षर है:।

struct Condition 
{ 
    bool operator()(std::unique_ptr<SomeType> ptr) const; 
}; 

, तो जाहिर है, संकेत के सभी के बाद अमान्य हो जाएँगे remove_if।)

+7

जेम्स कानज़ प्रश्न पूछ रहे हैं - एक बहुत ही दुर्लभ घटना! – Nawaz

+3

'unique_ptr' प्रतिलिपि बनाने योग्य नहीं है, इसलिए यदि आपने अनुमान लगाया है कि आपका कोड संकलित नहीं होगा। – interjay

+1

क्यों नहीं? 'std :: अद्वितीय' कॉपी करने योग्य नहीं है लेकिन जंगम है। इसे कंटेनर के अंत में ले जाया जा सकता है। –

उत्तर

2

25.3.8 N3290 में के बारे में समारोह को दूर बोलते:

आवश्यक है: * के प्रकार के पहले MoveAssignable आवश्यकताओं (तालिका 22) को संतुष्ट करेगा।

और

नोट: रेंज [सेवानिवृत्त में प्रत्येक तत्व, पिछले), जहां सेवानिवृत्त दिया जाता है मूल्य,, एक वैध लेकिन unspeci फाई एड राज्य है, क्योंकि एल्गोरिदम स्वैप करके तत्वों को समाप्त कर सकते उस श्रेणी में मूल रूप से तत्वों से या आगे बढ़ना।

इसका मतलब है कि यह आपके अनुमानित ऑपरेटर पर निर्भर करता है। चूंकि आपका भविष्य एक प्रतिलिपि नहीं बनाता है, इसलिए तत्वों की प्रतिलिपि नहीं बनाई जा रही है।

+0

§25.3.8/1 लक्ष्यित प्रकार पर एक बाधा है, 'निकालने' के कार्यान्वयन पर नहीं। §25.3.8/6 वह है जिसे मैं ढूंढ रहा था। बहुत खराब यह एक नोट है, और मानक नहीं है। लेकिन यह इरादा स्पष्ट करता है। मुझे पोस्टिंग से पहले नोट्स पढ़ना चाहिए, न केवल मानक पाठ होना चाहिए। वैसे भी +1, और अगर मैं कोई और निश्चित नहीं पाता हूं तो मैं इसे अंतिम प्रतिक्रिया मानूंगा। –

+0

मुझे n3242 मिल गया है। उसके बाद §25.3.8/6 जोड़ा गया है? मेरी/6 'remove_copy [_if]' के बारे में चर्चा करता है। – kennytm

+2

मेरा मानना ​​है कि नोट गलत है। अच्छी बात यह मानक नहीं है। ;-) एल्गोरिदम को तत्वों को स्वैप करने की अनुमति नहीं है क्योंकि तत्वों को स्वैप करने की आवश्यकता नहीं है। एल्गोरिदम केवल चाल असाइनमेंट का उपयोग कर सकता है। –

5

बस erase() और resize(), remove_if()होगा कदम तत्वों (संभवतः अदला-बदली के माध्यम से), तो कंटेनर तत्वों copyable होने की जरूरत नहीं है। unique_ptr के बारे में कुछ भी खास नहीं है, यह सिर्फ एक और चाल-केवल प्रकार है।

जैसा कि आप इंगित करते हैं, भविष्यवाणी निश्चित रूप से कॉन्स्ट-रेफरेंस द्वारा तत्व लेनी चाहिए। फिर, किसी भी चलने योग्य प्रकार की तरह।

+0

मानक में यह कहां कहा गया है? और सबसे महत्वपूर्ण बात यह है कि कहां है कि 'remove_if' कुछ अस्थायी में नहीं जाता है, शायद बाद में वहां मान छोड़ दें क्योंकि यह निर्धारित करता है कि इसे कहीं और रखने की आवश्यकता नहीं है? कंटेनर और वहां सदस्य फ़ंक्शंस को को स्थानांतरित करने के लिए संदर्भित किया गया है, लेकिन इस संबंध में 'remove_if' का वर्णन करने वाली भाषा में किसी भी बदलाव से मुझे अवगत नहीं है। –

+1

@JamesKanze: §25.3.8/1? – kennytm

+0

@ केनीटीएम: मुझे मारो, धन्यवाद! –

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