En fonction de la durée des chaînes (et de votre compilateur), il est préférable de ne pas dépasser operator==
. Sur Visual C++ v10, cela se réduit à un appel memcmp
via char_traits::compare
, qui est (lorsqu'il est optimisé) va comparer les gammes d'octets cibles en morceaux, probablement autant d'octets à la fois que le ferait un registre (4/8 pour 32/64 bits).
static int __CLRCALL_OR_CDECL compare(const _Elem *_First1, const _Elem *_First2,
size_t _Count)
{ // compare [_First1, _First1 + _Count) with [_First2, ...)
return (_CSTD memcmp(_First1, _First2, _Count));
}
Pendant ce temps, std::equal
(le plus alternatif) ne fait un octet par comparaison d'octets. Est-ce que quelqu'un sait si cela va être optimisé de la même manière, car ce sont des itérateurs inversés? Au mieux, la gestion de l'alignement est plus complexe car le début de la gamme n'est pas garanti bien aligné.
template<class _InIt1,
class _InIt2> inline
bool _Equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
{ // compare [_First1, _Last1) to [First2, ...)
for (; _First1 != _Last1; ++_First1, ++_First2)
if (!(*_First1 == *_First2))
return (false);
return (true);
}
pour une couleur sur GCC Voir la réponse de @ greyfade here.
peut-être un jeu sur ce serait d'utiliser string :: rfind au lieu d'égal. – frankc
@frankc: Je ne sais pas si 'str1.rfind (str2) == 0' se comparerait avant ou arrière. Si nous vérifions d'abord que les chaînes sont de longueur égale, il n'y a qu'une seule position à vérifier, donc ça vaut le coup d'essayer. En fait, techniquement, je ne sais pas si 'std :: equal' va vers l'avant ou vers l'arrière quand on l'applique à un itérateur à accès aléatoire, mais j'ai une forte suspicion ... –
ce n'est pas la partie itérateur aléatoire, c'est le fait 'rbegin'et' rend' return * reverse * les itérateurs qui confirment votre suspicion! Merci, je vais avoir un moment "Pourquoi n'ai-je pas pensé à cela" ... – rubenvb