4

在我们的一个班级中,先生说模板允许自定义类的行为,然后他给出了字符串类的示例,只需几行代码,我们就可以从 STL 自定义字符串类,例如,我们可以让它处理 ' a'和'z'一样,'b'和'y'一样,'c'和'x'一样等等。相似的'A'和'Z'相同等。

“abc” == “zyx” 为真;
“Abc” == “zyx” 为假;
"Abc == "Zyx" 为真;

ETC

我正在考虑实现这样的字符串类,但我不能这样做。我们如何使用模板实现这样的字符串类?

4

3 回答 3

3

这很棘手。您只需要编写自己的特征类,特别是您需要从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

于 2011-01-04T03:56:17.147 回答
2

您需要查看char_traits类型。这是一种类型的特征类的示例,您可以将其与 basic_string 一起使用以获得有效的字符串类型。如果您定义自己的特征类,则可以构建一个自定义字符串,如下所示:

class CustomTraits { ... };
typedef basic_string<char, CustomTraits> CustomString;

现在由 CustomTraits 定义的特征将用于确定字符串的工作方式。

作为您所说的示例,您可以执行以下操作:

class CustomTraits: public char_traits<char> {
public:
    /* Redefine equality to compare 'a' and 'z' equal. */
    static bool eq(char one, char two) {
         return one == two || (one == 'a' && two == 'z' || one == 'z' && two == 'a');
    }
};
typedef basic_string<char, CustomTraits> StringWithAAndZEqual;

现在,您可以使用新类型,并且该类将同等对待“a”和“z”。

于 2011-01-04T03:55:29.327 回答
2

您想要进行自定义char_traits并用它来实例化std::basic_string

于 2011-01-04T03:55:51.500 回答