Pour les besoins d'apprentissage et de comprendre comment les choses fonctionnent, je suis en train de réécrire cela sans modèles, dans le cas wstring
:algorithme plus lent après avoir retiré C++ template/typename
#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());
}
J'essaie ceci:
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());
}
il fonctionne, mais il est deux ou trois fois plus lents lorsque le comparant. Pourquoi?
Y a-t-il quelque chose qui ne va pas dans la "traduction sans modèles"?
Aussi, est-il possible d'éviter d'utiliser un struct
mais ayant la comparaison my_equal
directement dans search(...)
?
Pouvez-vous montrer comment vous avez référencé cela? Ils devraient en théorie produire exactement le même assemblage. – NathanOliver
@NathanOliver: sera difficile à montrer ici, car cela fait partie d'une grande application. Est-ce que 'const T &' => 'const wstring' est correct? (qu'en est-il de '&'?) Idem pour 'typename T :: const_iterator' =>' wstring :: const_iterator'? 'charT' =>' wchar_t'? – Basj
Votre version sans modèle fait probablement une copie des chaînes, alors que le modèle les passe comme 'const &' – peterchen