2008-11-12 17 views

उत्तर

11

हां, एल्गोरिदम शीर्षलेख में set_difference फ़ंक्शन है।

संपादन:

FYI करें, सेट डेटा संरचना कुशलता, कि एल्गोरिथ्म का उपयोग करने के रूप में अपनी documentation में कहा गया है में सक्षम है। एल्गोरिदम भी सेट पर नहीं बल्कि सॉर्ट किए गए संग्रहों पर इटरेटर की किसी भी जोड़ी पर काम करता है।

जैसा कि अन्य ने उल्लेख किया है, यह एक बाहरी एल्गोरिदम है, एक विधि नहीं। संभवतः यह आपके आवेदन के लिए ठीक है।

+1

यह क्रमबद्ध कंटेनरों के _any_ जोड़ी पर किया जा सकता। – xtofl

+0

अच्छा बिंदु ... मैंने संपादन में एक नोट जोड़ा है। –

1
एक विधि के रूप नहीं

लेकिन वहाँ बाहरी एल्गोरिथ्म समारोह set_difference

template <class InputIterator1, class InputIterator2, class OutputIterator> 
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, 
           InputIterator2 first2, InputIterator2 last2, 
           OutputIterator result); 

http://www.sgi.com/tech/stl/set_difference.html

4
नहीं

एक "ऑपरेटर" भाषा अर्थ में, लेकिन वहाँ मानक पुस्तकालय में set_difference एल्गोरिथ्म है:

http://www.cplusplus.com/reference/algorithm/set_difference.html

बेशक

, अन्य बुनियादी सेट के संचालन भी मौजूद हैं - (यूनियन इत्यादि), जैसा कि लिंक किए गए आलेख के अंत में "यह भी देखें" अनुभाग द्वारा सुझाया गया है।

119

हां वहाँ है, यह <algorithm> में है और इसे std::set_difference कहा जाता है। सेट results1-s2 शामिल होंगे

#include <algorithm> 
#include <set> 
#include <iterator> 
// ... 
std::set<int> s1, s2; 
// Fill in s1 and s2 with values 
std::set<int> result; 
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), 
    std::inserter(result, result.end())); 

अंत में,: उपयोग है।

+0

+1। अफसोस की बात है, जब मुझे इसकी आवश्यकता थी, मैंने अपना खुद का लूप छोड़ दिया और रोल किया :( – peterchen

+38

बीटीडब्ल्यू, यदि आप एक गैर-सहयोगी कंटेनर क्लास पर set_difference का उपयोग करते हैं, तो वेक्टर कहें, सुनिश्चित करें कि दोनों कंटेनरों में तत्व पहले क्रमबद्ध किए गए हैं ... ? – paxos1977

+4

# शामिल -> ऐसा कोई फ़ाइल, होना चाहिए stefanB

2

चयनित उत्तर सही है, लेकिन कुछ वाक्यविन्यास त्रुटियां हैं।

के बजाय

#include <algorithms> 

उपयोग

#include <algorithm> 
के बजाय

std::insert_iterator(result, result.end())); 

उपयोग

std::insert_iterator<set<int> >(result, result.end())); 
+7

या बस' std :: inserter (परिणाम, result.end()) ' – rlbond

0

हम सिर्फ एक बार फिर

set_difference(set1.begin(), set1.end(), set2.begin(). set2,end(),std::back_inserter(result)). 
+3

' std :: back_inserter' का उपयोग करें लक्ष्य कंटेनर 'परिणाम' पर' push_back() 'विधि। यह 'काम'' std :: set' होने पर काम नहीं करेगा – Attila

1

उपयोग कर सकते हैं, बचाव के लिए बढ़ावा देने के:

#include <string> 
#include <set> 
#include <boost/range/algorithm/set_algorithm.hpp> 

std::set<std::string> set0, set1, setDifference; 
boost::set_difference(set0, set1, std::inserter(setDifference, setDifference.begin()); 

setDifference set0-SET1 शामिल होंगे।

0

सी ++ एक सेट अंतर ऑपरेटर को परिभाषित नहीं करता, लेकिन आप अपने खुद के (कोड का उपयोग अन्य प्रतिक्रियाओं में दी गई) को परिभाषित कर सकते हैं:

template<class T> 
set<T> operator -(set<T> reference, set<T> items_to_remove) 
{ 
    set<T> result; 
    std::set_difference(
     reference.begin(), reference.end(), 
     items_to_remove.begin(), items_to_remove.end(), 
     std::inserter(result, result.end())); 
    return result; 
} 
संबंधित मुद्दे