最近在编程的时候自己写了一个大小写转换的函数,结果写完之后在网上看了看人家的类似实现,发现感触很深,C++的用法真是博大精深啊!
一搬而言进行大小写转换会采用如下用法:
#include <cctype>
#include <string>
using namespace std;
int main()
{
string s="hello";
for (int j=0; j<s.length(); ++j)
{
s[j]=toupper(s[j]);
}
}
利用了C类型的字符串处理方式,来逐个处理string内的字符。
此时如果利用了STL算法中的transform后问题就变的比较简单了,而且更具有通用性:
#include <cctype>
#include <string>
#include <algorithm>
using namespace std;
string s="hello";
transform(s.begin(), s.end(), s.begin(), toupper);
鉴于此我进行了如下封装,封装了如下大小写转换的函数:
//将string转换为大写形式
static bool Str2CapitalCase( std::string& str2Convert )
{
transform( str2Convert.begin(), str2Convert.end(), str2Convert.begin(), toupper );
return true;
}
//将string转化为小写形式
static bool Str2SmallCase( std::string& str2Convert )
{
transform( str2Convert.begin(), str2Convert.end(), str2Convert.begin(), tolower );
return true;
}
而且更进一步可以将这两个函数合二为一,通过标志来指定到底来调用哪一个函数来进行转换:
//通过用户指定的形式转换为相应的大小写形式
typedef int (*pf)(int);
static bool Str2SpecifiyCase( std::string& str2Convert, bool bFlag = false )
{
pf Pfun = tolower;
//缺省情况下为小写
if( true == bFlag )
{
Pfun = toupper;
}
//进行转换
transform( str2Convert.begin(), str2Convert.end(), str2Convert.begin(), Pfun );
return true;
}
更进一步可以通过模板技术进行修改
template<class T>
bool Str2SpecifiyCase( T& t, bool bFlag = true )
{
pf Pfun = tolower;
//缺省情况下为小写
if( true == bFlag )
{
Pfun = toupper;
}
//进行转换
transform( t.begin(), t.end(), t.begin(), Pfun );
return true;
}
c++真是强大!