the other topic में मैं this समस्या हल करने का प्रयास कर रहा था। समस्या std::string
से डुप्लिकेट वर्णों को निकालना था।`std :: set` के साथ क्या गलत है?
std::string s= "saaangeetha";
के बाद से क्रम महत्वपूर्ण नहीं था, इसलिए मैं s
पहले हल, और फिर std::unique
इस्तेमाल किया और अंत में the desired result पाने के लिए इसे पुनः आकार:
aeghnst
यह सही है!
अब मैं वही करना चाहता हूं, लेकिन साथ ही मैं अक्षरों का क्रम बरकरार रखना चाहता हूं।
sangeth
तो मैं this लिखा है::
template<typename T>
struct is_repeated
{
std::set<T> unique;
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
s.erase(std::remove_if(s.begin(), s.end(), is_repeated<char>()), s.end());
std::cout << s ;
}
कौन इस उत्पादन देता है: इसका मतलब है, मैं इस उत्पादन चाहते
saangeth
है, a
दोहराया है, हालांकि अन्य repetitions चला गया। कोड के साथ क्या गलत है?
वैसे भी मैं थोड़ा change my code: (टिप्पणी को देख)
template<typename T>
struct is_repeated
{
std::set<T> & unique; //made reference!
is_repeated(std::set<T> &s) : unique(s) {} //added line!
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
std::set<char> set; //added line!
s.erase(std::remove_if(s.begin(),s.end(),is_repeated<char>(set)),s.end());
std::cout << s ;
}
आउटपुट:
sangeth
समस्या चला गया!
तो पहले समाधान के साथ क्या गलत है?
इसके अलावा, अगर मैं सदस्य चर unique
संदर्भ प्रकार नहीं बनाता, तो the problem doesn't go।
std::set
या is_repeated
फ़ैक्टर के साथ क्या गलत है? वास्तव में समस्या कहां है?
मैं यह भी ध्यान देता हूं कि यदि is_repeated
फ़ैक्टर की प्रतिलिपि बनाई गई है, तो इसके प्रत्येक सदस्य की भी प्रतिलिपि बनाई जाती है। मुझे यहाँ समस्या नहीं दिख रही है!
, डेटा छँटाई हे है: या तो अपने functor refactor और यह राज्यविहीन बनाने या "कार्य करने के लिए टेम्पलेट्स (एल्गोरिदम) संदर्भ पारित करने के लिए है कि आमतौर पर उनके तर्कों की प्रतियां ले जाएगा" Boost.Ref करने के लिए उपयोग, इसलिए की तरह (एन लॉग एन)। ऐसा करने के लिए एक और अधिक कुशल एल्गोरिदम है। प्रत्येक चरित्र की घटनाओं की गिनती, स्ट्रिंग का रैखिक पास बनाएं। स्ट्रिंग का दूसरा पास बनाएं और गिनती 1 है तो केवल आउटपुट करें। यह ओ (एन) है। –
आपको दो पास की आवश्यकता नहीं है। बस एक बूल सरणी बनाएं और जांचें कि क्या bFound [c] == सत्य है अगर आप इसे परिणाम स्ट्रिंग में जोड़ते हैं और bFound [c] = true सेट करते हैं। इस तरह आप एक फ़िल्टर बनाते हैं और इसे एक पास में उपयोग करते हैं। –
@ जेफ: या किसी सेट के बजाय एक unordered_set का उपयोग करें। – kennytm