是否有一个内置函数可以将C++字符串从大写字母转换为小写字母?如果没有转换为cstring,那么在每个字符上使用tolower是唯一的选择?先谢谢你了。
fnvucqvd1#
如果boost是一个选项:
boost
#include <boost/algorithm/string.hpp> std::string str = "wHatEver"; boost::to_lower(str);
否则,您可以使用std::transform:
std::transform
std::string str = "wHatEver"; std::transform(str.begin(), str.end(), str.begin(), ::tolower);
如果您有一些自定义的支持区域设置的tolower,您还可以使用其他函数。
tolower
r8uurelv2#
std::transform(myString.begin(), myString.end(), myString.begin(), std::tolower);
9lowa7mx3#
就像有人说的:std::transform(str.begin(), str.end(), str.begin(), std::tolower );或通过for_each:std::for_each(str.begin(), str.end(), std::tolower );Transform可能是两者中更好的。
std::transform(str.begin(), str.end(), str.begin(), std::tolower );
std::for_each(str.begin(), str.end(), std::tolower );
czq61nw14#
对于这个问题,可以使用STL的变换方法来解决它:
std::string str = "simple"; std::transform(str.begin(), str.end(), str.begin(), std::tolower);
brvekthn5#
没有内置函数来完成这项工作,而且由于语言环境等原因,执行这项工作出奇地复杂。如果tolower能满足您的需要,它可能是您最好的选择。
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; }
我很想知道是否可以进一步提高性能。
8ehkhllq7#
以上答案产生了错误。这是完美的:
std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){ return std::tolower(c); });
7条答案
按热度按时间fnvucqvd1#
如果
boost
是一个选项:否则,您可以使用
std::transform
:如果您有一些自定义的支持区域设置的
tolower
,您还可以使用其他函数。r8uurelv2#
9lowa7mx3#
就像有人说的:
std::transform(str.begin(), str.end(), str.begin(), std::tolower );
或通过for_each:
std::for_each(str.begin(), str.end(), std::tolower );
Transform可能是两者中更好的。
czq61nw14#
对于这个问题,可以使用STL的变换方法来解决它:
brvekthn5#
没有内置函数来完成这项工作,而且由于语言环境等原因,执行这项工作出奇地复杂。如果
tolower
能满足您的需要,它可能是您最好的选择。lf5gs5x26#
我有一个实现,我发现它比std::transform快,编译于g ++-03 Fedora 18。我的例子转换std::string
我很想知道是否可以进一步提高性能。
8ehkhllq7#
以上答案产生了错误。这是完美的: