`
wooce
  • 浏览: 185361 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

字符串类的FindInclude(查找字符串是否包含在一个字符集中的字符)的实现优化

    博客分类:
  • C++
阅读更多
以下是coremail的cyt所写的实现代码:
int IString::FindInclude(const char * pscCharSet,int nBegin) const
{
if (nBegin>m_length) nBegin=m_length;

int p;
for (;*pscCharSet!='\0';pscCharSet++)
{
p=this->Find(*pscCharSet,nBegin);
if (p!=-1) return p;
}
return -1;
}

是否没优化余地了呢? 非也,我在离开coremail之后,在自己重新实现字符串类的时候在mozilla的代码中找到了同样功能的代码并移植过来了:
static char GetFindInSetFilter(const char *set)
{
    // Calculate filter
    char filter = ~char(0); // All bits set
    while (*set)
    {
        filter &= ~(*set);
        ++set;
    }

    return filter;
}

int TStr::FindCharInSet( const char* aCharSet,int nBegin) const
{
    if ( nBegin<0 )
        nBegin = 0;
    if ( *aCharSet && nBegin>length )
    {
        // Build filter that will be used to filter out characters with
        // bits that none of the terminal chars have. This works very well
        // because searches are often done for chars with only the last
        // 4-6 bits set and normal ascii letters have bit 7 set. Other
        // letters have even higher bits set.

        // Calculate filter
        char filter = GetFindInSetFilter(aCharSet);

        const char* endChar = str + length;
        for (char *charp = str + nBegin; charp < endChar; ++charp)
        {
            char currentChar = *charp;
            // Check if all bits are in the required area
            if (currentChar & filter)
            {
                // They were not. Go on with the next char.
                continue;
            }
            // Test all chars
            const char *charInSet = aCharSet;
            char setChar = *charInSet;
            while (setChar)
            {
                if (setChar == currentChar)
                {
                    // Found it!
                    return charp - str; // The index of the found char
                }
                setChar = *(++charInSet);
            }
        } // end for all chars in the string
    }
    return -1;
}
1
0
分享到:
评论

相关推荐

    python实现字符串模糊匹配

    编辑距离的定义是指将一个字符串转换为另一个字符串所需的最少操作次数,包括插入、删除和替换操作。 Python 中可以使用 LevenshteinDistance 函数来计算两个字符串之间的编辑距离。 FuzzyWuzzy 是一个 Python 库,...

    封装一个,完善字符串,字符串的基本操作

    必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到CmyString对象)、求字符串中的一个字符或改变字符串中的一个字符(采用重载[]),完成...

    入一个字符,再输入一个以回车结束的字符串(少于80个字符)在字符串中查找该字符。.cpp

    入一个字符,再输入一个以回车结束的字符串(少于80个字符)在字符串中查找该字符。

    C++课程设计之string字符串类

    本设计通过定义字符串类,实现了对字符串的赋值、连接、复制、查找、交换操作,提供了一个基本的字符串类设计方案,为后续的开发和应用提供了参考和借鉴。 六、参考文献 * C++ Primer Plus(第五版) * C++程序...

    汇编语言实验字符串位置的查找

    该子程序实现了在字符串中查找指定字符,并记录下字符的位置: ```assembly search proc;子程序 pushf push ax xor cx,cx mov cl,byte ptr[si+1] mov dl,0 mov ax,1 l3:cmp [si+2],dh jnz l1 inc dl mov ...

    在一个字符串中查找子串的个数

    根据给定的信息,本文将详细解释如何在一个字符串中查找特定子串出现的次数,并通过提供的代码示例来进一步阐述这一过程。我们将从以下几个方面进行深入探讨: ### 1. 字符串与子串的基本概念 #### 1.1 字符串 在...

    QT中字符串的比较、查找、替换等操作 - 大存的博客1

    `prepend()`函数用于在字符串前面添加内容,如`s8.prepend("Marco")`将在字符串" is good"前面加上"Marco"。 5. **字符串替换**: `replace()`函数可以用来替换字符串中的一部分,例如`"Marco is bad".replace(...

    MATLAB字符串数组中查找指定子串

    MATLAB提供了一个名为strfind的内置函数,可以用于在字符串数组中查找指定子串。strfind函数的基本语法为: ```matlab k = strfind(str, pattern) ``` 其中,`str`是要查找的字符串数组,`pattern`是要查找的子串,`...

    [字符串]字符串提取(获取两个字符串中间的字符串)

    在标准的字符串方法中,没有直接提供一个功能可以获取两个已知字符串之间的子串,但我们可以通过结合几个基本方法来实现这个功能。 1. **IndexOf**:此方法用于查找指定字符串在当前字符串中的第一次出现位置。...

    VB拆分字符串,分隔字符串

    在VB(Visual Basic)编程中,处理字符串是常见的任务之一,其中包括将一个长字符串拆分成多个子字符串。这个过程通常称为“字符串拆分”或“分隔字符串”。在这个主题中,我们将深入探讨VB中如何实现这一操作,以及...

    Java检索字符串中是否存在某字符

    如果我们要统计子串在主字符串中出现的次数,可以在找到一次匹配后,将主字符串的指针移动到匹配结束的位置加上next function的值,这样可以跳过已匹配的部分,继续寻找下一个匹配。 从提供的文件名来看,可能包含...

    写自定义函数stringLower()实现将一个字符串中所有大写字母变为小写字母。在主函数中输入一含有大写字母的字符串,调用该函数并输出改变后的字符串。

    本例中的目标是编写一个名为`stringLower()`的函数,它接受一个包含大写字母的字符串,并将其所有大写字母转换为小写字母。这个功能在处理用户输入、数据清理或格式化输出时非常有用。下面我们将详细讨论如何实现这...

    C语言中查找字符在字符串中出现的位置的方法

    在C语言中,查找字符在字符串中出现的位置是常见的任务,这可以通过标准库提供的`strchr()`和`strrchr()`函数来实现。这两个函数都包含在`&lt;string.h&gt;`头文件中,它们的主要区别在于查找的方向:`strchr()`从字符串的...

    封装一个,完善字符串,字符串

     必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到CmyString对象)、求字符串中的一个字符或改变字符串中的一个字符(采用重载[]),...

    PTA 6-13 函数实现字符串逆序

    - 初始化两个指针,一个在字符串开头,一个在末尾。 - 交换两个指针所指向的字符,然后逐步向中间移动,直到两个指针相遇或交叉。 这种方法时间复杂度为O(n),空间复杂度为O(1),其中n是字符串长度。 2. **递归...

    十六进制字符串至普通转化_十六进制字符串转普通字符串_labview十六进制_

    1. 分割十六进制字符串:由于每个ASCII字符由两个十六进制数字组成,我们需要将输入的十六进制字符串按每两个字符进行分割,形成一个十六进制数字的数组。 2. 转换为数值:对分割后的数组中的每个十六进制数字,...

    字符串类报告(里面包含源代码)

    在这个字符串类报告中,我们关注的是如何通过自定义一个名为`TString`的字符串类来实现对字符串的各种基本操作。这个类提供了丰富的功能,包括构造函数的重载、运算符的重载以及对字符串的常见操作。以下是这个类的...

    C#实现移除字符串末尾指定字符的方法

    方法的核心逻辑是使用`LastIndexOf`方法查找指定字符在字符串末尾出现的位置。如果找到了这个字符,就使用`Substring`方法截取字符串的前部分,不包括指定字符;如果没有找到,就直接返回原始字符串。 ```csharp ...

    查找字符串中出现重复次数最多的字符

    本主题关注的是如何查找一个字符串中出现重复次数最多的字符。这是一个典型的字符串处理问题,对于理解字符串操作和优化算法能力的提升非常有帮助。 首先,我们要明确问题的目标:给定一个字符串,找出其中出现频率...

    字符串处理类String实现

    在`String`类中,可能在构造字符串时就预留一部分额外的内存空间,这样在字符串长度增加时,就不需要每次都进行内存重新分配。例如,当创建一个空字符串时,`String`类可能会预先分配16个字符的空间,之后每次字符串...

Global site tag (gtag.js) - Google Analytics