मैं सीपीपी में एसटीएल से गुजर रहा हूं और मुझे List.

कोड के नीचे लिखा:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    list<int> ls;
    ls.push_back(23);
    ls.push_front(34);
    ls.push_front(39);
    ls.push_front(334);
    ls.push_front(434);
    ls.push_front(7834);
    ls.push_front(634);
    ls.push_front(934);

    list<int>::iterator it10 = ls.begin();
    list<int>::iterator it11 = ls.end();
    list<int>::reverse_iterator it12 = ls.rbegin();
    list<int>::reverse_iterator it13 = ls.rend();

    ls.sort();

    for (auto it = it10; it != it11; it++)
    {
        cout << *(it) << "\n";
    }
}

तो यहां मैं सूची को सॉर्ट करने से पहले इटरेटर्स को परिभाषित कर रहा हूं और मुझे आउटपुट मिलता है:

934
7834

लेकिन अगर मैं इटरेटर्स को परिभाषित करने से पहले सॉर्ट करता हूं जैसे:


ls.sort();

list<int>::iterator it10 = ls.begin();
list<int>::iterator it11 = ls.end();
list<int>::reverse_iterator it12 = ls.rbegin();
list<int>::reverse_iterator it13 = ls.rend();

मुझे सही आउटपुट मिल रहा है:

23
34
39
334
434
634
934
7834

यह ऐसा व्यवहार क्यों कर रहा है यह कैसे काम करता है? कृपया समझाएँ। धन्यवाद!

0
heeat 26 सितंबर 2020, 13:35

1 उत्तर

सबसे बढ़िया उत्तर

it10 सूची में तत्व 934 का पुनरावर्तक है। it11 सूची के अंत में एक पुनरावर्तक है। छँटाई के बाद it10 तत्व 934 का पुनरावर्तक है और it11 सूची के अंत में एक पुनरावर्तक है। छँटाई के बाद 934 से शुरू होने वाले तत्व हैं:

943 
7834

std::list::sort के बारे में cppreference से:

std::sort के लिए रैंडम एक्सेस इटरेटर की आवश्यकता होती है और इसलिए इसका उपयोग सूची के साथ नहीं किया जा सकता है। यह फ़ंक्शन std::sort से भी भिन्न होता है, जिसमें सूची के तत्व प्रकार को स्वैप करने योग्य होने की आवश्यकता नहीं होती है, सभी पुनरावृत्तियों के मूल्यों को संरक्षित करता है, और एक स्थिर प्रकार का प्रदर्शन करता है।

std::sort के साथ पुनरावर्तक अमान्य हो जाते हैं। std::list::sort के साथ ऐसा नहीं है। मैला बोलना, std::lists में इटरेटर आम तौर पर दूसरों की तुलना में अधिक स्थिर होते हैं। आपके उदाहरण में it10 और it11 अभी भी समान तत्वों की ओर इशारा करते हैं। छँटाई के बाद, जो तत्व पहले स्थान पर था वह अब पहले स्थान पर नहीं है। यह दूसरे लेकिन अंतिम स्थान पर है और it11 अभी भी सूचियों end की ओर इशारा करता है।

विचार करें कि एक std::list एक लिंक्ड सूची है, क्रम बदलने के लिए यह आवश्यक नहीं है कि मेमोरी में अन्य पदों पर तत्वों को संशोधित या स्थानांतरित किया जाए, केवल लिंक को अपडेट करना होगा।

1
largest_prime_is_463035818 26 सितंबर 2020, 14:05