2010-09-17 8 views
10

से निकाला जा रहा है डुप्लिकेट सालों के लिए मैं निम्नलिखित पद्धति का उपयोग कर सी ++ std::vector प्रकार का ऑब्जेक्ट से डुप्लिकेट को दूर करने के लिए किया गया है क्यूटी QList<> कक्षा के साथ, या यदि ऐसा करने के लिए एक और अधिक शानदार तरीका है।एक QList

+1

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

+0

और हाँ बस फिर से खोजे गए, std :: सूची में 'अद्वितीय' सदस्य फ़ंक्शन भी है जिसका अर्थ है कि यह std :: अद्वितीय पर बेहतर है। –

+0

धन्यवाद यह इंगित करने के लिए अमित, लेकिन मैं std :: list <> अधिक का उपयोग नहीं करता (हर्ब सटर की सलाह के बाद कि std :: वेक्टर ज्यादातर मामलों में "दाएं" कंटेनर का उपयोग करने के लिए है; यहां तक ​​कि सी ++ मानक में भी ऐसा है एक सिफारिश, 23.1.1/2 देखें)। –

उत्तर

11

मुझे प्रदर्शन के बारे में पता नहीं है, लेकिन QList को QSet में परिवर्तित करने के बारे में क्या?

QList<int> myQList; 
//... 
QSet<int> = QSet::fromList(myQList); 
// or 
QSet<int> = myQList.toSet(); 

(और शायद इसे वापस एक QList में बदलने का है, तो QList::fromSet() साथ आवश्यक)

+0

वह _is_ एक तरीका है, निश्चित रूप से, लेकिन फिर मैं QSet <> सीधे उपयोग करूंगा।मैं आमतौर पर अनुक्रमिक कंटेनर पसंद करता हूं (जो सबसे अधिक उपयुक्त विकल्प होते हैं), इसलिए QSet <> या std :: set को ओवरकिल माना जा सकता है। –

+0

मुझे लगता है कि यह स्वाद का विषय है: यदि मुझे डुप्लीकेट के बिना तत्वों की एक सूची स्टोर करने की आवश्यकता है, तो मैं हमेशा एक सेट चुनता हूं। हालांकि मैंने कभी प्रदर्शन की तुलना नहीं की। –

+1

ठीक है, मैं 'std :: set' या 'std :: map' का उपयोग करता था, जब तक कि मुझे प्रदर्शन समस्याओं से लड़ना पड़े। अब मैं उस रास्ते जाने से पहले दो बार सोचता हूं ;-)। –

1

आप इस सूची बना रहे हैं:

फिर परहेज डुप्लिकेट डुप्लिकेट को दूर करने के लिए एक व्यवहार्य विकल्प हो सकता है।

QList<int> cont; 
int incomingValue; 
if(!cont.contains(incomingValue)) 
{ 
    cont.append(incomingValue); 
} 

इसके अतिरिक्त, के बाद से इस QList <> (और न केवल QList < पूर्णांक>) के बारे में एक सवाल ...

कुछ एक कस्टम वर्ग का उपयोग किया जा सकता है, और डुप्लिकेट से बचने के लिए की तरह है।

QVector के साथ यह लगता है:

class SoftDrink 
{ 
public: 
    int oz 
    QString flavor 
    bool operator==(const Beverage &other) const{ 
     uint hash = qHash(flavor)^oz; 
     uint otherHash = qHash(other.flavor)^other.oz; 
     return hash == otherHash; 
    } 
} 

एक == ऑपरेटर एक की तरह ऊपर QList वारंटी के बिना एक कस्टम डेटाप्रकार

QList<SoftDrink> uniquePurchaseHistory; 
SoftDrink newPurchase; 
if(!uniquePurchaseHistory.contains(newPurchase)){ 
    uniquePurchaseHistory.append(newPurchase); 
} 
0

के खिलाफ होता है() विधि का मूल्यांकन करने की अनुमति दे सकते काम ...

QVector<int> v; 
std::sort(v.begin(), v.end()); 

v.erase(std::unique(v.begin(), v.end()), v.end());//remove duplicates 

वेक्टर बैक टी से ओ सूची:

QVector<QString> vect; 
vect << "red" << "green" << "blue" << "black"; 

QList<QString> list = vect.toList(); 
// list: ["red", "green", "blue", "black"] 
संबंधित मुद्दे