gpt4 book ai didi

c++ - 使用自定义行为实现字符串类

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:20 25 4
gpt4 key购买 nike

在我们的一个类(class)中,先生说模板允许一个人自定义类的行为,然后他给出了字符串类的例子,用几行代码我们可以从 STL 中自定义字符串类,就像我们可以做到的那样将'a'和'z'相同,'b'和'y'相同,'c'和'x'相同,依此类推。类似的 'A' 和 'Z' 相同等。

"abc"== "zyx"为真;
"abc"== "zyx"为假;
"abc == "Zyx"为真;

等等

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

最佳答案

这很棘手。您只需要编写自己的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

关于c++ - 使用自定义行为实现字符串类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4590472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com