Это очень сложно.Все, что вам нужно, чтобы написать собственный класс traits , в частности, вам нужно извлечь его из шаблона класса char_traits<>
и переопределить eq () и compare () функция (Примечание: только переопределение eq () не будет работать; даже если нет никаких изменений в переопределении compare () , вы должны записать его в свой производный класс кактакие!).Скажем, это черта класса sequence_traits
и вызов вашей пользовательской строки sequence
.В конце концов, строка - это последовательность символов!
Примечание: Из вашего поста я понимаю, что вы хотите, чтобы alphabets[i] == alphabets[25-i]
рассматривался как один и тот же, то есть первая буква и последняя буквато же самое, второе письмо и второе последнее письмо то же самое, и так далее!
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);
}
};
И тогда вы можете сделать это typedef
для простоты использования:
typedef basic_string<char, sequence_traits> sequence;
Все готово.Вы можете использовать sequence
сейчас.: -)
Рабочий пример: http://www.ideone.com/ByBRV
Прочтите эту статью, чтобы узнать, как это работает в деталях: http://www.gotw.ca/gotw/029.htm