Std में कॉपी / चाल असाइनमेंट :: वेक्टर :: erase () और std :: deque :: erase ()


135

एक और सवाल का जवाब देने की प्रक्रिया में मैं कुछ अलग शब्दों के लिए लड़खड़ाया std::vector::erase()और std::deque::erase()

यह वही है जो C ++ 14 के बारे में कहता है std::deque::erase( [deque.modifiers]/4-6,, मेरा जोर):

प्रभाव: ...

जटिलता: विध्वंसक को कॉल की संख्या उसी तरह होती है जैसे कि मिटाए गए तत्वों की संख्या, लेकिन असाइनमेंट ऑपरेटर को कॉल की संख्या तत्वों की संख्या से कम नहीं है पहले मिटाए गए तत्वों और तत्वों की संख्या से पहले मिटाए गए तत्व।

फेंकता है: कॉपी कंस्ट्रक्टर द्वारा कोई अपवाद नहीं फेंके जाने तक, कंस्ट्रक्टर, असाइनमेंट ऑपरेटर, या असाइनमेंट ऑपरेटर को स्थानांतरित न करें T

और यहाँ इसके बारे में क्या कहते हैं std::vector::erase( [vector.modifiers]/3-5):

प्रभाव: ...

जटिलता: की नाशक Tसमय की संख्या कहा जाता है मिट तत्वों की संख्या के बराबर है, लेकिन इस कदम असाइनमेंट ऑपरेटर के Tसमय की संख्या कहा जाता है मिट तत्वों के बाद वेक्टर में तत्वों की संख्या के बराबर।

फेंकता है: कॉपी कंस्ट्रक्टर द्वारा कोई अपवाद नहीं फेंके जाने तक, कंस्ट्रक्टर, असाइनमेंट ऑपरेटर, या असाइनमेंट ऑपरेटर को स्थानांतरित न करें T

जैसा कि आप देख सकते हैं, उन दोनों के लिए अपवाद विनिर्देश समान हैं, लेकिन इसके लिए std::vectorस्पष्ट रूप से उल्लेख किया गया है कि चाल असाइनमेंट ऑपरेटर कहा जाता है।

वहाँ भी के लिए आवश्यकता है Tहोना करने के लिए MoveAssignableके लिए erase()दोनों के साथ काम करने के लिए std::vectorऔर std::deque(तालिका 100), लेकिन इस कदम असाइनमेंट ऑपरेटर की उपस्थिति संकेत नहीं करता है: एक एक प्रति असाइनमेंट ऑपरेटर परिभाषित कर सकते हैं, और इस कदम असाइनमेंट ऑपरेटर को परिभाषित नहीं है, और इस वर्ग होगा हो MoveAssignable

बस के मामले में, मैंने जीसीसी और क्लैंग के साथ जांच की, और वास्तव में std::vector::erase()कॉपी असाइनमेंट ऑपरेटर को कॉल करता है अगर कोई चाल असाइनमेंट ऑपरेटर नहीं है, और std::deque::erase()वही ( डीईएमओ ) करता है।

तो सवाल यह है: क्या मुझे कुछ याद आया, या यह मानक में एक (संपादकीय) मुद्दा है?

अद्यतन: मैंने # 2477 LWG समस्या प्रस्तुत की है ।


14
मानक में एक दोष की तरह लगता है।
बैरी

4
^ ack। एक LWG- मुद्दा उचित होगा।
कोलम्बो

4
आमतौर पर मसौदा मानक काफी अच्छा है। यह उन मामलों में से एक है जहां आपको वास्तविक चीज को देखना चाहिए।
मार्क रैनसम

3
@MarkRansom std :: deque और std :: वेक्टर का वर्तमान स्रोत प्रश्न में जैसा है, इसलिए अंतिम संस्करण में भिन्नता की संभावना बहुत कम है।
एंटोन साविन

3
N4141 में N4140 के समान शब्द है।
ब्रायन

जवाबों:


9

Lenexa बैठक में प्रस्तावित प्रस्ताव के साथ समस्या को तत्काल दर्जा मिला :

यह शब्दांकन N4296 के सापेक्ष है।

23.3.3.4 [deque.modifiers] / 5 को बदलें:

-5 जटिलता : नाशक कॉल की संख्या काT मिट तत्वों की संख्या के रूप में ही है, लेकिन असाइनमेंट ऑपरेटर के लिए कॉल की संख्या काT मिट तत्वों और इससे पहले कि तत्वों की संख्या के कम से अधिक नहीं है मिटाए गए तत्वों के बाद तत्वों की संख्या।

23.3.6.5 [वेक्टर.modifiers] / 4 को बदलें:

-4- जटिलता : नष्ट होने Tवाले तत्व को नष्ट किए गए तत्वों की संख्या के बराबर संख्या कहा जाता है, लेकिन चाल असाइनमेंट ऑपरेटर Tको मिटाने वाले तत्वों के बाद वेक्टर में तत्वों की संख्या के बराबर संख्या कहा जाता है।

यही है, यदि संकल्प स्वीकार किया जाता है, तो इसके लिए चाल असाइनमेंट का कोई विशेष उल्लेख नहीं होगा std::vector::erase, और इसके लिए शब्दांकन को भी std::deque::eraseथोड़ा स्पष्ट किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.