2013-02-24 50 views
5

सॉर्ट किए गए तत्वों को रखने के लिए तो मेरे पास एक वेक्टर है, और मैं तत्वों को हर समय सॉर्ट करना चाहता हूं। मुझे उस वेक्टर में तत्व डालने और तत्वों को सॉर्ट करने के दौरान मुझे कैसे हटाया जाना चाहिए। मैंने std::lower_bound में देखा, हालांकि, जो मैंने चाहता था उसके विपरीत दिया।सॉर्ट किए गए वेक्टर में तत्व डालने और

उदाहरण के लिए, मैं यही चाहता हूं: जब मैं वेक्टर में सभी तत्वों को पॉप करता हूं तो यह होना चाहिए: 1 2 3 4 5. इसका मतलब है कि वेक्टर को उन्हें 5 4 3 2 के रूप में स्टोर करना होगा 1. यदि उपयोग करें निचला बाउंड, वेक्टर उन्हें 1 2 3 4 5 के रूप में स्टोर करता है, और यह 5 4 3 2 के रूप में पॉप किया जाता है 1. इसके अलावा, एक तुलना करने वाले मिक्सर को पारित किया जा रहा है ताकि lower_bound फ़ंक्शन तुलना करने वाले फ़ैक्टर का उपयोग कर सके। तुलनात्मक फिक्सर के विपरीत लेने का कोई तरीका है?

+2

वैसे, 'std :: set' अनुसार क्रमबद्ध बातें रखती है, बल्कि आप डुप्लिकेट नहीं हो सकता (' देख std :: multiset')। विपरीत लेने के लिए, 'std :: not1' है। – chris

+0

शायद आप गलत कंटेनर का उपयोग कर रहे हैं। यहां एक नज़र डालें: http://stackoverflow.com/a/471461/78845 – Johnsyweb

उत्तर

21

अपने वेक्टर को हर समय क्रमबद्ध रखने के लिए, आपको हमेशा नए तत्वों को उचित स्थिति में डालना चाहिए। चूंकि आप आरोही क्रम में तत्वों को पॉप करना चाहते हैं और वेक्टर केवल pop_back() विधि प्रदान करता है, आपको तत्वों को अवरोही क्रम में सॉर्ट करना चाहिए। इसलिए सबसे पहले आप उचित स्थिति को खोजने के लिए और फिर वहाँ डालने की जरूरत है:

typedef std::vector<int> ints; 

void insert(ints &cont, int value) { 
    ints::iterator it = std::lower_bound(cont.begin(), cont.end(), value, std::greater<int>()); // find proper position in descending order 
    cont.insert(it, value); // insert before iterator it 
}