2017-07-11 3 views
1

zu Lernzwecken und zu verstehen, wie die Dinge funktionieren, ich versuche, dies ohne Vorlagen neu zu schreiben, in dem Fall wstring:Algorithmus langsamer nach C entfernt wird ++ template/Typnamen

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

ich dies versuchen:

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

es funktioniert, aber es ist zwei- oder dreimal langsamer, wenn es Benchmarking. Warum?

Gibt es etwas falsch in der "Übersetzung ohne Vorlagen"?

Ist es auch möglich, eine struct zu vermeiden, aber den my_equal Vergleich direkt in search(...)?

+1

Können Sie zeigen, wie Sie das Benchmarking? Sie sollten theoretisch genau die gleiche Baugruppe produzieren. – NathanOliver

+0

@NathanOliver: wird hier schwer zu zeigen sein, weil es Teil einer großen Anwendung ist. Ist 'const T &' => 'const wstring' korrekt? (Was ist mit dem '&'?) Idem für 'typename T :: const_iterator' =>' wstring :: const_iterator'? 'charT' =>' wchar_t'? – Basj

+11

Ihre Nicht-Template-Version erstellt wahrscheinlich eine Kopie der Strings, während die Vorlage sie als 'const &' – peterchen

Antwort

2

Sie haben einige Et-Zeichen weggelassen. Machen Sie es,

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