C++ 删除C+后算法速度变慢+;模板/类型名
出于学习目的和理解事情是如何工作的,我尝试在不使用模板的情况下重写它,例如C++ 删除C+后算法速度变慢+;模板/类型名,c++,templates,typename,C++,Templates,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&a
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 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());
}
你能展示一下你是如何进行基准测试的吗?理论上,它们应该生成完全相同的程序集。您的非模板版本可能会生成字符串的副本,而模板将它们作为
const&
@peterchen Good spot传递。我错过了。这将破坏性能。const T&=>const wstring&
bool包含(const wstring&str1、const wstring&str2)
-参见此处示例:
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());
}