从1D阵列中删除多个引用

Removing multiple occurrences from a 1D Array

本文关键字:引用 删除 1D 阵列      更新时间:2023-10-16

我编写了一个函数,该函数将从1D数组中删除多次出现的字母。但是,如果有两个相同的字母一个接一个,while循环会在索引增加到数组的下一个位置时错过第二个字母。

void removeAllOccurrences(char text[], char letter)
{
    int index(0);
    while (text[index] != EOT)
    {
        if ((text[index] == letter) || (text[index] == toupper(letter)))
        {
            text[index] = text[index + 1];          
        }
        ++index;
    }
}

如果数组存储单词[a][b][c][c][EOT],并且我想删除字母c。输出将是abcEOT,但我希望删除所有出现的c。所以输出应该是abEOT。

您可以使用两个索引来完成此操作。第一个迭代数组,第二个指向存储字符的位置。

如果不应删除当前字符,则只能增加第二个索引。

void removeAllOccurrences(char text[], char letter)
{
    int index(0);
    int indexOut(0);
    while (text[index] != EOT)
    {
        if ((text[index] != letter) && (text[index] != toupper(letter)))
        {
            text[indexOut] = text[index];
            ++indexOut;
        }
        ++index;
    }
    // we want to keep EOT ?
    text[indexOut] = EOT;
}

我从其他事件中知道这个问题,比如试图从集合中删除对象时:

我会倒退!:-)

===>从文本开始。GetUpperBound(0),然后将索引减少1,直到达到0。

您可以使用std::remove_if:

void removeAllOccurrences(char text[], char letter)
{
    auto it = std::remove_if(text, text + strlen(text), [letter](char c)
        { return toupper(c) == toupper(letter) ;});
    *it = '';
}

实例