非常にトリッキーです。のみ当量(再定義)動作しません:あなたはあなた自身の特性クラスを記述する必要があるのは、特にあなたはchar_traits<>
クラステンプレートからそれを導出し、EQ()とは()機能(比較注を再定義する必要がありますのcompare()の再定義に変更はありませんが、そのように派生クラスに書く必要があります)。この特性クラスはsequence_traits
で、カスタム文字列はsequence
となります。結局のところ、文字列は一連の文字です!
注:alphabets[i] == alphabets[25-i]
は同じものとして扱われることをあなたの投稿から理解しています。つまり、最初の文字と最後の文字は同じです、2番目の文字と2番目の最後の文字は同じです。
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
私もC++に新たなんだけど、私はこれはとは何かを持っていると思いますキャラクターの特性。 – dreamlax