C'est très compliqué. Tout ce que vous devez écrire vos propres traits classe, en particulier, vous devez le déduire de char_traits<>
modèle de classe et redéfinir eq() et COMPARE() fonction (Remarque: seule la redéfinition eq() ne fonctionnerait pas Même s'il n'y a aucun changement dans la redéfinition de compare(), vous devez l'écrire dans votre classe dérivée en tant que telle!). Disons cette classe de traits sequence_traits
et appelez votre chaîne personnalisée sequence
. Après tout, la chaîne est une séquence de caractères!
Note: Ce que je comprends de votre message que vous voulez alphabets[i] == alphabets[25-i]
à traiter comme même, ce qui signifie, première lettre et la dernière lettre même, la deuxième lettre et deuxième dernière lettre même, et ainsi de suite!
struct sequence_traits : char_traits<char>
{
//'a' and 'z' are equal
//'b' and 'y' are equal
//'c' and 'x' are equal, and so on.
//that implies, 'a' + 'z' == 'b' + 'y' == 'c' + 'x' == 'd' + 'w == so on
//same for upper cases!
static bool eq(const char& left, const char& right)
{
return (left == right) || (left + right == 'a' + 'z') || (left + right == 'A' + 'Z') ;
}
static int compare(const char *first1, const char *first2, size_t count)
{
for (; 0 < count; --count, ++first1, ++first2)
if (!eq(*first1, *first2))
return (lt(*first1, *first2) ? -1 : +1);
return (0);
}
};
Et vous pouvez le faire typedef
pour une utilisation facile:
typedef basic_string<char, sequence_traits> sequence;
Vous avez terminé. Vous pouvez utiliser sequence
maintenant.:-)
Exemple de travail: http://www.ideone.com/ByBRV
Lire cet article pour savoir comment cela fonctionne en détail: http://www.gotw.ca/gotw/029.htm
Je suis nouveau à C++ aussi bien, mais je pense que cela a quelque chose à voir avec traits de caractère. – dreamlax