2017-07-11 3 views
1

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(...)?

+1

Pouvez-vous montrer comment vous avez référencé cela? Ils devraient en théorie produire exactement le même assemblage. – NathanOliver

+0

@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

+11

Votre version sans modèle fait probablement une copie des chaînes, alors que le modèle les passe comme 'const &' – peterchen

Répondre

2

Vous avez omis certaines esperluettes. Faites-le,

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