2016-01-25 2 views
6

unordered_set में तत्वों के अनियमित जोड़े के पुनरावृत्ति के लिए एक संक्षिप्त तरीका क्या है?एक unordered_set के अंदर unordered जोड़े पर फिर से कैसे करें?

(तो क्रम आवश्यक नहीं है और तत्व अलग होना चाहिए)

उदा {1, 2, 3} => (1, 2) (2, 3) (1, 3)

for (i = 0; i < size - 1; i++) { 
    for (j = i + 1; j < size; j++) { 
    ... 
    } 
} 

की तरह कुछ

मेरे आरंभिक प्रयास थे लेकिन वह साथ नहीं सुपर सुविधाजनक है iterators।

+3

@arainone 'मैंने प्रश्न नहीं पढ़ा' का संभावित मामला। – orlp

+0

तो कुछ सेट 'एक्स' के लिए आप '{(x1, x2) चाहते हैं। x1, x2 ∈ एक्स, x1 \t ≠ x2} '? क्या मैंने उसे सही पढ़ा? –

+0

ओवरलैप ('[0,1], [1,2] [2,3] ...') होना चाहिए या आप चाहते हैं कि '[0,1], [2,3] [4,5] .. .'? – NathanOliver

उत्तर

7

यह काम करना चाहिए, यह देखते हुए एक std::unordered_sets:

auto set_end = s.end(); 
for (auto ai = s.begin(); ai != set_end; ++ai) { 
    for (auto bi = std::next(ai); bi != set_end; ++bi) { 
     // *ai, *bi 
    } 
} 

यह मूलतः पूर्णांकों में निम्न में से इटरेटर बराबर है:

for (int i = 0; i < n; ++i) { 
    for (int j = i + 1; j < n; ++j) { 
     // i, j 
    } 
} 
+0

मैं पुरानी शैली के 'लूप' पर 'std :: for_each' का सुझाव दूंगा। – caps

+2

@caps 'std :: for_each' iterators नहीं देता है, और आंतरिक पाश बाहरी पाश के पुनरावर्तक पर निर्भर करता है। – orlp

+0

जिज्ञासा के मामले में, क्या कोई कारण है कि आपने लूप में 's.end()' के बजाय 'set_end' का उपयोग किया था? – erip

1

यहाँ अर्द्ध सामान्य रूप में orlp के समाधान है।

template<typename ForwardIterator, typename DestItr> 
auto cartesian_product(ForwardIterator b, ForwardIterator e, DestItr d) -> DestItr { 
    using std::next; 
    using std::for_each; 
    for (; b != e; ++b) { 
     for_each(next(b), e, [&](auto right){ 
      *d++ = std::make_tuple(*b, right); 
     }); 
    } 
    return d; 
} 

template<typename ForwardRange, typename DestItr> 
auto cartesian_product(ForwardRange r, DestItr d) -> DestItr { 
    using std::begin; 
    using std::end; 
    return cartesian_product(begin(r), end(r), d); 
} 

Live on Coliru.

आप सकता है, ज़ाहिर है, इसे और अधिक कस्टम functors make_tuple और असाइनमेंट ऑपरेटर के बजाय का उपयोग करने के लिए भार के होने से सामान्य हैं। मानक लाइब्रेरी एल्गोरिदम ऐसा करते हैं। क्या मैं इसे पुस्तकालय के लिए लिख रहा था, मैं शायद ऐसा भी करूंगा।

+0

इस 'cartesian_product' को नाम न दें, क्योंकि यह निश्चित रूप से कार्टशियन उत्पाद __not__ है। यह अपने साथ एक सेट के 2 संयोजन है। – orlp

+0

हम्म। कुछ ... 'self_combination'? 'Self_permutations_combination'? – caps

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