2009-05-25 33 views
65

मुझे लगता है कि यह एक साधारण सवाल है। मैं इस तरह से कुछ करने की जरूरत है: के बाद से वहाँ कोई push_back हैstd :: back_inserter एक std :: set के लिए?

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); 
बेशक

, std::back_inserter काम नहीं करता। std::inserter को भी एक पुनरावर्तक की आवश्यकता है? मैंने std::inserter का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि क्या करना है।

क्या किसी के पास कोई विचार है?


बेशक, मेरा दूसरा विकल्प s2 के लिए वेक्टर का उपयोग करना है, और फिर इसे बाद में सॉर्ट करें। शायद यह बेहतर है?

उत्तर

98

set में push_back नहीं है क्योंकि किसी तत्व की स्थिति सेट के तुलनित्र द्वारा निर्धारित की जाती है। std::inserter का उपयोग करें और यह .begin() पारित:

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
transform(s1.begin(), s1.end(), 
      std::inserter(s2, s2.begin()), ExcitingUnaryFunctor()); 

डालने इटरेटर तो s2.insert(s2.begin(), x) फोन करेगा जहां x इटरेटर को भेजे गए मान जब यह करने के लिए लिखा है। सेट इटरेटर को एक संकेत के रूप में कहां डालने के लिए उपयोग करता है। आप s2.end() का भी उपयोग कर सकते हैं।

+0

std :: map के लिए भी काम करता है (आपने अपना समय बचाया, धन्यवाद)। – FreeNickname

+1

'इंसर्टर (वीसी, vec.end()) के बाद से' वैक्टरों के लिए भी काम करता है, क्यों कोई भी पहली जगह बैक_इन्सेटर का उपयोग करता है? – NHDaly

+5

@NHDaly: क्योंकि back_inserter तेज़ है – marton78

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