Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除C+后算法速度变慢+;模板/类型名_C++_Templates_Typename - Fatal编程技术网

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());
}