2017-07-11 15 views
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(...)

+1

このベンチマークをどのように表示できますか?彼らは理論的にまったく同じアセンブリを作り出すべきです。 – NathanOliver

+0

@ NathanOliver:大きなアプリケーションの一部であるため、ここに表示することは難しいでしょう。 'const T&' => 'const wstring'は正しいですか? ( '&'についてはどうでしょうか?) 'typename T :: const_iterator' =>' wstring :: const_iterator'のためのIdem? 'charT' =>' wchar_t'? – Basj

+11

テンプレート以外のバージョンでは文字列のコピーが作成されますが、テンプレートは 'const&'としてそれらを渡します – peterchen

答えて

2

アンパサンドを省略しました。作成する、

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()); 
} 
関連する問題