在我们的一个类先生说,模板允许一个人自定义类的行为,然后他给出了字符串类的例子,用几行代码我们就可以自定义STL中的字符串类,就像在中,我们可以做到同时对待'a'和'z','b'和'y'相同,'c'和'x'相同等等。类似'A'和'Z'相同等。
“abc”==“zyx”为真;
“abc”==“zyx”为假;
“Abc ==”Zyx“是真的;
等
我正在考虑实现这样的字符串类,但我无法这样做。我们如何使用模板实现这样的字符串类?
答案 0 :(得分:3)
这很棘手。所有你需要编写自己的 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
答案 1 :(得分:2)
您需要查看char_traits类型。这是一种类型的traits类的示例,您可以将其与basic_string一起使用以获得有效的字符串类型。如果您定义自己的traits类,则可以构建一个自定义字符串,如下所示:
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”。
答案 2 :(得分:2)
您希望自定义char_traits
并使用该std::basic_string
实例化。{/ p>