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(...)
?
Können Sie zeigen, wie Sie das Benchmarking? Sie sollten theoretisch genau die gleiche Baugruppe produzieren. – NathanOliver
@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
Ihre Nicht-Template-Version erstellt wahrscheinlich eine Kopie der Strings, während die Vorlage sie als 'const &' – peterchen