2010-08-04 10 views
13

क्या ऊपरी केस अक्षरों से लोअरकेस अक्षरों में सी ++ स्ट्रिंग को परिवर्तित करने के लिए एक अंतर्निहित फ़ंक्शन है? यदि इसे क्रिस्टिंग में परिवर्तित नहीं किया जा रहा है और प्रत्येक char पर टोलर का उपयोग करना एकमात्र विकल्प है?सी ++ तारों के लिए धीमी कार्यक्षमता

अग्रिम में बहुत बहुत धन्यवाद।

+4

जर्मनी में, tolower ("STRASSE") का परिणाम "स्ट्रैस" होना चाहिए। स्विस में, यह "strasse" होना चाहिए। और दुनिया भर में इस तरह के कई और मामले हैं। एक इनबिल्ट फ़ंक्शन को उन मामलों को सही तरीके से संभालना चाहिए। यदि आपको परवाह नहीं है, तो प्रत्येक वर्ण पर केवल उतारने वाले() का उपयोग करें क्योंकि अधिकांश उत्तर दिखाते हैं। – Sjoerd

+0

@Sjoerd: अच्छा उदाहरण। क्या आपने किसी भी लाइब्रेरी के बारे में सुना है जो उन मामलों से गर्व से संबंधित है? मुझे इसमें दिलचस्पी हो सकती है। – ereOn

+0

@ereOn: नहीं, मुझे कभी भी एक की आवश्यकता नहीं है। मुझे पता है कि tolower() के साथ समस्याएं हैं, लेकिन जहां मैं रहता हूं और जिन अनुप्रयोगों में मैं लिखता हूं, में धीमा() आमतौर पर "पर्याप्त अच्छा" होता है। – Sjoerd

उत्तर

1

ऐसा करने के लिए कोई अंतर्निहित कार्य नहीं है, और यह स्थानीय और अन्य लोगों की वजह से आश्चर्यजनक रूप से जटिल है। यदि tolower आपको जो चाहिए वह करता है, तो यह आपकी सबसे अच्छी शर्त हो सकती है।

#include <boost/algorithm/string.hpp>  

std::string str = "wHatEver"; 
boost::to_lower(str); 

अन्यथा, आप std::transform उपयोग कर सकते हैं:

std::string str = "wHatEver"; 
std::transform(str.begin(), str.end(), str.begin(), ::tolower); 

तुम भी एक और समारोह का उपयोग कर सकते है अगर आप कुछ कस्टम स्थान-अवगत tolower है

11
std::transform(myString.begin(), myString.end(), myString.begin(), std::tolower); 
+5

यह और अन्य परिवर्तन + हल करने वाले उत्तरों को ध्यान में रखना चाहिए कि इस फ़ाइल में मानक शीर्षलेख शामिल किए जाने के आधार पर यह आवश्यक रूप से संकलित नहीं होगा।'' में '' tolower' है और ' 'में एक अधिभार है। यदि दोनों शामिल हो जाते हैं, तो आपको एक कंपाइलर त्रुटि मिल जाएगी। उदाहरण के लिए देखें: http://stackoverflow.com/questions/1350380/problems-using-stl-stdtransform-from-cygwin-g – UncleBens

+0

ध्यान दें कि यह उत्तर (और अन्य सभी 'ट्रांसफॉर्म' उत्तरों) संभावित रूप से अपरिभाषित व्यवहार का कारण बनता है, क्योंकि 'cstdlib' की 'std :: tolower' को एक गैर-नकारात्मक तर्क –

2

ereOn की तरह कहते हैं: std::transform(str.begin(), str.end(), str.begin(), std::tolower);

या for_each के माध्यम से: std::for_each(str.begin(), str.end(), std::tolower);

रूपांतरण शायद दोनों में से बेहतर है।

+2

की आवश्यकता है, इसलिए मैं शर्त लगाता हूं। for_each str नहीं बदलता है। –

+0

यह कफ से लिखा गया था। आप प्रत्येक चरित्र के लिए tolower कॉल करने के लिए एक lamda का उपयोग कर सकते हैं। –

0

इस समस्या के लिए आप एसटीएल के बदलने विधि का उपयोग कर सकते हैं इसे हल करने:

std::string str = "simple"; 
std::transform(str.begin(), str.end(), str.begin(), std::tolower); 
0

मैं है एक कार्यान्वयन मैं यह तेजी से एसटीडी से :: बदलना, जी में संकलित ++ -03 फेडोरा 18. मेरी उदाहरण धर्मान्तरित पाया std :: स्ट्रिंग

 
performance time in seconds : 
transform took   : 11 s 
my implementation took : 2 s 
Test data size = 26*15*9999999 chars 
inline void tolowerPtr(char *p) ; 

inline void tolowerStr(std::string& s) 
{char* c=const_cast<char*>(s.c_str()); 
size_t l = s.size(); 
    for(char* c2=c;c2<c+l;c2++)tolowerPtr(c2); 
}; 

inline void tolowerPtr(char *p) 
{ 
switch(*p) 
{ 
    case 'A':*p='a'; return; 
    case 'B':*p='b'; return; 
    case 'C':*p='c'; return; 
    case 'D':*p='d'; return; 
    case 'E':*p='e'; return; 
    case 'F':*p='f'; return; 
    case 'G':*p='g'; return; 
    case 'H':*p='h'; return; 
    case 'I':*p='i'; return; 
    case 'J':*p='j'; return; 
    case 'K':*p='k'; return; 
    case 'L':*p='l'; return; 
    case 'M':*p='m'; return; 
    case 'N':*p='n'; return; 
    case 'O':*p='o'; return; 
    case 'P':*p='p'; return; 
    case 'Q':*p='q'; return; 
    case 'R':*p='r'; return; 
    case 'S':*p='s'; return; 
    case 'T':*p='t'; return; 
    case 'U':*p='u'; return; 
    case 'V':*p='v'; return; 
    case 'W':*p='w'; return; 
    case 'X':*p='x'; return; 
    case 'Y':*p='y'; return; 
    case 'Z':*p='z'; return; 
}; 
return ; 
} 

void testtransform(std::string& word) 
{ 
std::string word2=word; 
time_t t; 
time_t t2; 
time(&t); 
std::cout << "testtransform: start " << "\n"; 
int i=0; 
for(;i<9999999;i++) 
{ word2=word; 
    std::transform(word2.begin(), word2.end(), word2.begin(), ::tolower); 
} 
time(&t2); 
std::cout << word2 << "\n"; 
std::cout << "testtransform: end " << i << ":"<< t2-t << "\n"; 
} 

void testmytolower(std::string& word) 
{ 
std::string word2=word; 
time_t t; 
time_t t2; 
time(&t); 
std::cout << "testmytolower: start " << "\n"; 
int i=0; 
for(;i<9999999;i++) 
{ word2=word; 
    cstralgo::tolowerStr(word2); 
} 
time(&t2); 
std::cout << word2 << "\n"; 
std::cout << "testmytolower: end " << i << ":"<< t2-t << "\n"; 
} 

int main(int argc, char* argv[]) 
{ 
    std::string word ="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    word =word+word+word+word+word+word+word+word+word+word+word+word+word+word+word; 
    testtransform(word); 
    testmytolower(word); 
    return 0; 
} 

मुझे पता है कि अगर प्रदर्शन आगे सुधार किया जा सकता खुशी होगी।

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