1
を除去したし、物事の仕組みを理解することの後にアルゴリズム遅く、私はケースwstring
には、テンプレートなしでこれを書き換えるしようとしています:学習目的のためにC++テンプレート/型名
#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());
}
ベンチマークすると2倍または3倍遅くなります。どうして?
"テンプレートなしの翻訳"に何か問題はありますか?
また、struct
を使用することを避けることはできますが、my_equal
を直接比較してください。search(...)
?
このベンチマークをどのように表示できますか?彼らは理論的にまったく同じアセンブリを作り出すべきです。 – NathanOliver
@ NathanOliver:大きなアプリケーションの一部であるため、ここに表示することは難しいでしょう。 'const T&' => 'const wstring'は正しいですか? ( '&'についてはどうでしょうか?) 'typename T :: const_iterator' =>' wstring :: const_iterator'のためのIdem? 'charT' =>' wchar_t'? – Basj
テンプレート以外のバージョンでは文字列のコピーが作成されますが、テンプレートは 'const&'としてそれらを渡します – peterchen