2013-04-24 17 views
23

मैं दो std::setदो std :: set की तुलना कैसे करें?

#include <cstdlib> 
#include <cstdio> 
using namespace std; 

#include <vector> 
#include <set> 


int main(int argc, char** argv) 
{ 
    int myints1[]= {10,20,30,40,50}; 
    int myints2[]= {50,40,30,20,10}; 
    std::set<int> s1 (myints1,myints1+5); 
    std::set<int> s2(myints2,myints2+5); 
    if(s1==s2){ 
     printf("sets: true"); 
    }else printf("sets: false"); 
    std::set<int>::iterator it2=s2.begin(); 
    for(std::set<int>::iterator it1=s1.begin();it1!=s1.end();it1++){ 
       printf("\ns1: %d s2: %d",*it1,*it2); 
     it2++; 
    } 
} 

उत्पादन के इस तरह के तुलना करें:

sets: true 
s1: 10 s2: 10 
s1: 20 s2: 20 
s1: 30 s2: 30 
s1: 40 s2: 40 
s1: 50 s2: 50 

प्रश्न:

इस यह करने के लिए सही तरीका है? या दो सेट की तुलना करने का कोई अन्य (विशेष) तरीका है?

+3

यदि 'std :: set' लागू करता है 'ऑपरेटर ==' मुझे उम्मीद है कि यह सही होगा। –

+0

यह इसे लागू करता है, और यह सही काम करता है। लेकिन क्या यह सवाल है? या आप पूछ रहे हैं कि 'फॉर लूप सही है या नहीं? – jogojapan

+1

यदि आप 's1' और 's2' do _not_ तत्वों को निर्धारित करने के लिए कोई तरीका ढूंढ रहे हैं, तो आप [' std :: set_symmetric_difference'] (http://en.cppreference.com/] को देखना चाहेंगे डब्ल्यू/सीपीपी/एल्गोरिदम/set_symmetric_difference) ' 'हेडर से। – jogojapan

उत्तर

30

हाँ, operator== सही ढंग से सभी मानक कंटेनरों के लिए परिभाषित किया गया है (छोड़कर अव्यवस्थित कंटेनरों - पर मानक के 23.2.5.2 आधारित), और एक कोषगत तुलना करना आम तौर पर होगा। उदाहरण के लिए देखें here। प्रासंगिक बोली:

जांच करें कि क्या LHS और RHS की सामग्री को बराबर हैं, वह है, lhs.size() == rhs.size() और एलएचएस में प्रत्येक तत्व एक ही पर आरएचएस में बराबर तत्व है कि क्या पद।

std::set के बाद से एक का आदेश दिया कंटेनर, (दिए गए तुलनाकारक ही कर रहे हैं) एक ही आकार और एक ही तत्वों के साथ किसी भी सेट जरूरी उन्हें एक ही स्थिति में होगा, इसलिए बराबर की तुलना करेंगे है।

+0

लेकिन समान तत्वों के साथ दो सेट लेकिन गणितीय रूप से अलग-अलग स्थितियों में समान हैं। क्या वे std :: set == में भी बराबर हैं? मुझे लगता है कि हाँ, लेकिन पुनरावृत्ति और कॉमप्रे हमें भ्रामक परिणाम –

+7

@gumtree 'std :: set' तत्वों को आपके द्वारा डालने के क्रम में नहीं रखता है। यह उन्हें टाइप करता है। इसलिए, पुनरावृत्ति '== 'काम (और' std :: बराबर' कामों की तरह ही काम करेगी)। – jogojapan

+0

@gumtree यह बात है - 'सेट' का आदेश दिया गया है (इसके लिए दूसरा टेम्पलेट तर्क एक तुलना ऑपरेटर है), इसलिए दो सेट एक ही तुलनित्र और समान तत्व हैं ** ** उन्हें अलग-अलग स्थितियों में नहीं रख सकते हैं। – Yuushi

15

सी ++ मानक लाइब्रेरी हेडर <algorithm> में कई सेट ऑपरेशन हैं।

std::set_difference उन तत्वों को सेट 1 में हैं, लेकिन सेट नहीं 2.

std::set_intersection उन तत्वों को दोनों सेट में हैं देता है देता है।

std::set_symmetric_difference उन तत्वों को देता है जो सेट में से एक में दिखाई देते हैं लेकिन दोनों नहीं।

std::set_union उन तत्वों या तो कर रहे हैं 1 सेट या भी std::set के अलावा अन्य एसटीएल कंटेनरों को लागू किया जा सकता 2.

एल्गोरिदम ऊपर सेट है कि देता है, लेकिन कंटेनर पहले क्रमबद्ध करना (std::set डिफ़ॉल्ट रूप से क्रमबद्ध किया जाता है है)।

0

एक और तरीका यह होगा:

template<typename Set> 

bool set_compare(Set const &lhs, Set const &rhs){ 
    return lhs.size() == rhs.size() 
     && equal(lhs.begin(), lhs.end(), rhs.begin()); 
} 

सुरुचिपूर्ण जवाब here से प्रेरित होकर।

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