用于C++字符串的tolower函数

14ifxucb  于 2023-01-18  发布在  其他
关注(0)|答案(7)|浏览(152)

是否有一个内置函数可以将C++字符串从大写字母转换为小写字母?如果没有转换为cstring,那么在每个字符上使用tolower是唯一的选择?
先谢谢你了。

fnvucqvd

fnvucqvd1#

如果boost是一个选项:

#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,您还可以使用其他函数。

r8uurelv

r8uurelv2#

std::transform(myString.begin(), myString.end(), myString.begin(), std::tolower);
9lowa7mx

9lowa7mx3#

就像有人说的:std::transform(str.begin(), str.end(), str.begin(), std::tolower );
或通过for_each:std::for_each(str.begin(), str.end(), std::tolower );
Transform可能是两者中更好的。

czq61nw1

czq61nw14#

对于这个问题,可以使用STL的变换方法来解决它:

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

brvekthn5#

没有内置函数来完成这项工作,而且由于语言环境等原因,执行这项工作出奇地复杂。如果tolower能满足您的需要,它可能是您最好的选择。

lf5gs5x2

lf5gs5x26#

我有一个实现,我发现它比std::transform快,编译于g ++-03 Fedora 18。我的例子转换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;
}

我很想知道是否可以进一步提高性能。

8ehkhllq

8ehkhllq7#

以上答案产生了错误。这是完美的:

std::transform(str.begin(), str.end(), str.begin(),
        [](unsigned char c){ return std::tolower(c); });

相关问题