tolower function for C++ strings

前端 未结 6 977
误落风尘
误落风尘 2020-12-11 01:19

Is there an inbuilt function to convert C++ string from upper case letters to lowercase letters ? If not converting it to cstring and using tolower on each char is the only

相关标签:
6条回答
  • 2020-12-11 01:55

    If boost is an option:

    #include <boost/algorithm/string.hpp>    
    
    std::string str = "wHatEver";
    boost::to_lower(str);
    

    Otherwise, you may use std::transform:

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

    You can also use another function if you have some custom locale-aware tolower.

    0 讨论(0)
  • 2020-12-11 02:02

    Like ereOn says: std::transform(str.begin(), str.end(), str.begin(), std::tolower );

    Or via for_each: std::for_each(str.begin(), str.end(), std::tolower );

    Transform is probably better of the two.

    0 讨论(0)
  • 2020-12-11 02:05
    std::transform(myString.begin(), myString.end(), myString.begin(), std::tolower);
    
    0 讨论(0)
  • 2020-12-11 02:06

    For this problem you can use the STL's transform method to solve it:

    std::string str = "simple";
    std::transform(str.begin(), str.end(), str.begin(), std::tolower);
    
    0 讨论(0)
  • 2020-12-11 02:10

    There is no built-in function to do this, and doing it is surprisingly complicated, because of locales et al. If tolower does what you need, it may be your best bet.

    0 讨论(0)
  • 2020-12-11 02:16

    I have an implementation I found it faster than std::transform , Compiled in g++ -03 Fedora 18. my example converts std::string

    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;
    }
    

    I will be glad to know if performance can be improved further.

    0 讨论(0)
提交回复
热议问题