2011-05-11 16 views
5

के साथ सभी अपरकेस Leters में स्ट्रिंग कन्वर्ट करें मैं इसे प्राप्त करने के लिए ट्रांसफॉर्म एल्गोरिदम और std :: toupper का उपयोग कर रहा हूं, लेकिन क्या यह इस तरह एक पंक्ति में किया जा सकता है?std :: ट्रांसफॉर्म

transform(s.begin(), s.end(), ostream_iterator<string>(cout, "\n"),std::toupper); 

मैं इस पर त्रुटि मिलती है, तो मैं इसके लिए एक एकल समारोह बनाने के लिए और फोन बदलने के साथ या मैं कुछ एडेप्टर का उपयोग कर सकते है?

+1

आपको जो वास्तविक त्रुटि मिल रही है उसे पोस्ट करना महत्वपूर्ण है। विशेष रूप से स्वीकार्य उत्तर पर एक टिप्पणी में आपने उस त्रुटि को जोड़ा है, और बदले में यह कहता है कि समस्या ओवरलोड रिज़ॉल्यूशन के साथ है। उस बिंदु पर, सभी जानकारी के साथ, लोग समस्या के बारे में स्पष्ट स्पष्टीकरण के साथ आ सकते हैं और इसे सुलझाने के विभिन्न तरीकों के बजाय, केवल एक काम के बजाय, आपको अगली समान समस्या (उपयोग करने पर ओवरलोड रिज़ॉल्यूशन) एक टेम्पलेट में एक फ़ंक्शन) –

+0

हाँ, मैं त्रुटि के बारे में भूल गया, क्षमा करें – Kobe

उत्तर

9

उपयोग ostream_iterator<string> के बजाय ostream_iterator<char>:

transform(s.begin(),s.end(),ostream_iterator<char>(cout,"\n"),std::toupper); 

std::transform प्रत्येक चरित्र बदल देती है और यह उत्पादन iterator के लिए गुजरती हैं। यही कारण है कि आउटपुट इटरेटर का प्रकार तर्क std::string के बजाय होना चाहिए।

वैसे, प्रत्येक चरित्र को एक नई लाइन पर मुद्रित किया जाएगा। क्या तुम यही चाहते हो? यदि नहीं, "\n" पास न करें।

-

नोट: आप ::toupper बजाय std::toupper उपयोग करने के लिए हो सकता है।

इन

+0

मुझे लगता है कि आपका क्या मतलब है, लेकिन मुझे चार के साथ एक ही त्रुटि मिलती है: -/ – Kobe

+0

त्रुटि: कॉल के लिए कोई मिलान करने वाला फ़ंक्शन 'ट्रांसफॉर्म (std :: basic_string :: iterator, std :: basic_string :: iterator, std :: ostream_iterator , <अनसुलझा अधिभारित फ़ंक्शन प्रकार>) ' – Kobe

+0

@vBx: आपको 'std :: toupper के बजाय' :: toupper' का उपयोग करना पड़ सकता है '। संपादन और डेमो देखें। – Nawaz

4

सबसे पहले, अगर आप चाहते हैं उत्पादन char रों करने के लिए (और सभी char एस), आप ostreambuf_iterator<char> का उपयोग करने की आवश्यकता होगी, और ostream_iterator<string> नहीं। और ostreambuf_iterator<char> व्यक्त करता है जो आप ostream_iterator<char> से बेहतर चाहते हैं; आप char एस आउटपुट कर रहे हैं, कुछ भी स्वरूपित नहीं कर रहे हैं। (ostream_iterator<< ऑपरेटर, जो प्रारूप का उपयोग करता है।)

दूसरा, जानते हैं कि हमेशा एक एक के बाद एक के लिए ( ऊपरी मामले में जैसे 'ß' नक्शे दो चरित्र अनुक्रम "SS" करने के लिए) ऊपरी करने के लिए कम से अनुवाद नहीं है कि हो सकता है , इसलिए std::transform का उपयोग वास्तव में नौकरी करने के लिए नहीं किया जा सकता है। (और निश्चित रूप से, यह यूटीएफ -8 जैसे मल्टीबाइट एन्कोडिंग को सही तरीके से संभाल नहीं करता है।) सबसे सरल उपयोगों के लिए, आपको कुछ अधिक जटिल की आवश्यकता है। लेकिन फिर भी सरलतम मामलों के लिए:

std::toupper ओवरलोड हो गया है: भार के में से एक एक टेम्पलेट है, जो दो तर्क लेता है, और अन्य एक समारोह जो एक एकल int लेता है; न तो यहां सीधे काम करेगा, और तथ्य यह है कि transform भी एक टेम्पलेट का अर्थ है कि ओवरलोड रिज़ॉल्यूशन और टेम्पलेट प्रकार कटौती तब भी काम नहीं करेगी जब उन्होंने किया था। तो मूल रूप से, आपको कुछ जोड़ना होगा।यह अगर आप पर्याप्त क्वालिफायर जोड़ सकते हैं और दूसरा तर्क बाध्य करने के लिए उपयोग करें boost::bind या कुछ इसी तरह की 2 तर्क टेम्पलेट समारोह का उपयोग करना संभव है, लेकिन यह एक सरल toupper कार्यात्मक तर्क अपने आप लेखन के रूप में लगभग के रूप में ज्यादा पाठ है। और अगर आप एक तर्क प्रपत्र (जो स्पष्ट रूप से पहुँचा जा सकता है अगर आप <ctype.h> और ::toupper का उपयोग शामिल है) अगर आप एक char तर्क के रूप में उपयोग करने के लिए जब आप यह कहते हैं क्योंकि यह व्यवहार अपरिभाषित है का उपयोग नहीं कर सकते हैं: आप कन्वर्ट करने के लिए है charunsigned char करने के लिए पहले (जब तक, ज़ाहिर है, सादा char कार्यान्वयन आप — उपयोग कर रहे हैं और सभी कार्यान्वयन में अहस्ताक्षरित है जो अपने कोड कभी स्थलांतरित हो जाएगा करने के लिए)।

+0

+1, यह वास्तव में निपटता है अंधेरे में बदलाव का प्रस्ताव देने के बजाय, सवाल में मुद्दा। 'Int toupper (int)' का उपयोग करने वाले एक साधारण समाधान के लिए आपको केवल अंतिम तर्क में एक कलाकार की आवश्यकता है: 'std :: transform (..., (int (*) (int)) std :: toupper);' , क्योंकि यह अधिभार को हल करेगा: केवल 'टॉपर' अधिभार में से एक को उस विशेष फ़ंक्शन हस्ताक्षर पर डाला जा सकता है। –

+0

@ डेविड समस्या यह है कि 'int toupper (int)' का उपयोग अपरिभाषित व्यवहार में परिणाम; आप इसे सीधे उपयोग नहीं करना चाहते हैं। –

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