删除 C++ 后算法变慢 template/typename
Algorithm slower after having removed C++ template/typename
为了学习目的和理解事情是如何工作的,我试图在没有模板的情况下重写它,在这种情况下 wstring
:
#include <ctype.h>
template<typename charT>
struct my_equal
{
bool operator()(charT ch1, charT ch2) { return toupper(ch1) == ch2; }
};
template<typename T>
bool contains(const T& str1, const T& str2)
{
typename T::const_iterator it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal<typename T::value_type>());
return (it != str1.end());
}
我正在尝试这个:
struct my_equal
{
bool operator()(wchar_t ch1, wchar_t ch2) { return toupper(ch1) == ch2; }
};
bool contains(const wstring str1, const wstring str2)
{
wstring::const_iterator it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal());
return (it != str1.end());
}
它可以工作,但在对其进行基准测试时速度要慢两倍或三倍。为什么?
"translation without templates"有什么问题吗?
此外,是否可以避免使用 struct
而直接在 search(...)
中进行 my_equal
比较?
您遗漏了一些符号。成功了,
bool contains(const wstring &str1, const wstring &str2)
{
wstring::const_iterator it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal());
return (it != str1.end());
}
为了学习目的和理解事情是如何工作的,我试图在没有模板的情况下重写它,在这种情况下 wstring
:
#include <ctype.h>
template<typename charT>
struct my_equal
{
bool operator()(charT ch1, charT ch2) { return toupper(ch1) == ch2; }
};
template<typename T>
bool contains(const T& str1, const T& str2)
{
typename T::const_iterator it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal<typename T::value_type>());
return (it != str1.end());
}
我正在尝试这个:
struct my_equal
{
bool operator()(wchar_t ch1, wchar_t ch2) { return toupper(ch1) == ch2; }
};
bool contains(const wstring str1, const wstring str2)
{
wstring::const_iterator it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal());
return (it != str1.end());
}
它可以工作,但在对其进行基准测试时速度要慢两倍或三倍。为什么?
"translation without templates"有什么问题吗?
此外,是否可以避免使用 struct
而直接在 search(...)
中进行 my_equal
比较?
您遗漏了一些符号。成功了,
bool contains(const wstring &str1, const wstring &str2)
{
wstring::const_iterator it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal());
return (it != str1.end());
}