gpt4 book ai didi

c++ - basic_string 的前导/尾随空格不敏感特征

转载 作者:太空狗 更新时间:2023-10-29 23:10:59 25 4
gpt4 key购买 nike

我正在做很多解析/处理,其中给出了前导/尾随空格和不区分大小写。因此,我为 std::basic_string(见下文)制作了一个基本的字符特征,以节省一些工作。

特征不工作,问题是 basic_string 的比较调用特征比较,如果评估为 0,它返回大小差异。在 basic_string.h 中它说 ...如果比较的结果是非零返回它,否则较短的先排序。 看起来他们明确不想要我要这样做...

如果 trait 的比较返回 0,为什么要有这个额外的 “更短的” 排序?而且,是否有任何解决方法,或者我是否必须滚动自己的字符串?

#include <cstring>
#include <iostream>

namespace csi{
template<typename T>
struct char_traits : std::char_traits<T>
{
static int compare(T const*s1, T const*s2, size_t n){
size_t n1(n);
while(n1>0&&std::isspace(*s1))
++s1, --n1;
while(n1>0&&std::isspace(s1[n1-1]))
--n1;
size_t n2(n);
while(n2>0&&std::isspace(*s2))
++s2, --n2;
while(n2>0&&std::isspace(s2[n2-1]))
--n2;
return strncasecmp(static_cast<char const*>(s1),
static_cast<char const*>(s2),
std::min(n1,n2));
}
};
using string = std::basic_string<char,char_traits<char>>;
}

int main()
{
using namespace csi;
string s1 = "hello";
string s2 = " HElLo ";
std::cout << std::boolalpha
<< "s1==s2" << " " << (s1==s2) << std::endl;
}

最佳答案

将具有不止一种可能表示的数据转换为“标准”或“正常”形式称为规范化。对于文本,它通常意味着去除重音、大小写、修剪空白字符和/或格式字符。

如果规范化在每次比较期间都在幕后完成,那么它是脆弱的。例如,您如何测试 s1s2 是否正确完成?它也不灵活,例如你不能显示它的结果或缓存它以供下一次比较。因此,将其作为显式规范化步骤来执行会更加稳健和高效。

What is the reason for having this additional "shorter one" ordering if trait's compare returns 0?

Traits 比较只需要比较 n 个字符,所以当您比较 "hellow""hello" 时,它应该返回什么?它应该返回 0。如果您以某种方式忽略了那个 n,那么您就处于有缺陷的情况下,因为这些特征应该与不是零终止的 std::string_view 一起使用。如果删除大小比较,则 "hellow""hello" 将比较相等,这可能是您不希望的。

关于c++ - basic_string 的前导/尾随空格不敏感特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53030287/

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