最近在做一个文本处理项目中,需要对一些字符进行判断,看这个字符是否是数字,英文或是标点符号,于是写下了如下的代码。
// 是否是数字
bool _IsNumber( const wchar_t & ch )
{
const wchar_t ArrayOfNumbers[] = {L"0123456789"};
for (unsigned int i = 0; i < ARRAYSIZE(ArrayOfNumbers) - 1; ++i)
{
if (ch == ArrayOfNumbers[i])
{
return true;
}
}
return false;
}
// 是否是英文字符
bool _IsEnglish( const wchar_t & ch )
{
const wchar_t ArrayOfEnglish[] = {L"aeioubcdfghjklmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
for (unsigned int i = 0; i < ARRAYSIZE(ArrayOfEnglish) - 1; ++i)
{
if (ch == ArrayOfEnglish[i])
{
return true;
}
}
return false;
}
// 是否是结束标点
bool _IsEndPunctuation( const wchar_t & ch )
{
const wchar_t ArrayOfEndPunctuation[] = {L"。?!.?!"};
for (unsigned int i = 0; i < ARRAYSIZE(ArrayOfEndPunctuation) - 1; ++i)
{
if (ch == ArrayOfEndPunctuation[i])
{
return true;
}
}
return false;
}
类似这样的代码还有很多,通过对比发现其实这样的函数算法基本上是相同的,可以通过泛型来解决,于是用以下这个模板进行替换。
template <typename ITERATOR, typename ARRAY, typename ELEMENT>
inline bool _IsMatchArrayElement(ITERATOR begin, ITERATOR end, ARRAY array, ELEMENT element)
{
for (; begin != end; ++begin)
{
if (element == array[begin])
{
return true;
}
}
return false;
}
于是原先的函数就变成了如下:
// 是否是数字
bool _IsNumber( const wchar_t & ch )
{
const wchar_t ArrayOfNumbers[] = {L"0123456789"};
return _IsMatchArrayElement(size_t(), ARRAYSIZE(ArrayOfNumbers) - 1, ArrayOfNumbers, ch);
}
// 是否是英文字符
bool _IsEnglish( const wchar_t & ch )
{
const wchar_t ArrayOfEnglish[] = {L"aeioubcdfghjklmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
return _IsMatchArrayElement(size_t(), ARRAYSIZE(ArrayOfEnglish) - 1, ArrayOfEnglish, ch);
}
// 是否是结束标点
bool _IsEndPunctuation( const wchar_t & ch )
{
const wchar_t ArrayOfEndPunctuation[] = {L"。?!.?!"};
return _IsMatchArrayElement(size_t(), ARRAYSIZE(ArrayOfEndPunctuation) - 1, ArrayOfEndPunctuation, ch);
}
模板把算法抽象出来,这样的话就简单多了。
“泛型编程是算法导向的,以算法为中心,逐渐将其所涉及的概念内涵模糊化、外延扩大化,并将其所涉及的运算抽象化、一般化,从而提高算法的可重用性。”
这里也说一下这种方法的优缺点:优点是每个函数写法上简单很多,去掉了算法上的冗余且不损失性能,节省了N行代码,省纸环保 。缺点是没有边界检查,溢出了也不知道,参数的有效性由调用者保证,另外如果项目是按照代码行数给钱的话就亏大发了。:-)
对于这类问题应该还有更好地解决方法,欢迎各位朋友在这里讨论。
这是本人第一次在博客园发博文,希望能够在这里结识更多新朋友。
浙公网安备 33010602011771号