Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用双分段搜索从数组中删除字符串_C++_Arrays_String_Function - Fatal编程技术网

C++ 使用双分段搜索从数组中删除字符串

C++ 使用双分段搜索从数组中删除字符串,c++,arrays,string,function,C++,Arrays,String,Function,我有两个功能。函数Find执行双段搜索,这意味着它将按段搜索数组,直到找到键并返回其位置。函数removef或(remove fast)获取该位置并将其从字符串数组中移除。我使用的命令行界面要求用户输入命令和字符串(正在删除的字符串),因此不需要提示用户输入字符串 这是我的Find函数 int StringList::Find(string key, int start, int end) { int middle = (end + start)/2; if (key >

我有两个功能。函数Find执行双段搜索,这意味着它将按段搜索数组,直到找到键并返回其位置。函数removef或(remove fast)获取该位置并将其从字符串数组中移除。我使用的命令行界面要求用户输入命令和字符串(正在删除的字符串),因此不需要提示用户输入字符串

这是我的Find函数

int StringList::Find(string key, int start, int end)
{
    int middle = (end + start)/2;
    if (key > str[middle])
    {
        return Find(key,middle,end);
    }
    else if ( key < str[middle])
    {
        return Find(key,start,middle);
    }
    else if (key == str[middle])
    {
        return middle;
    }
}
int-StringList::Find(字符串键、int-start、int-end)
{
中间整数=(结束+开始)/2;
如果(键>str[中间])
{
返回查找(键、中间、结束);
}
否则如果(键
Find函数应该确定键是在数组的上半部分还是下半部分(中间上方或中间下方),然后继续分割,直到找到需要删除的键或字符串

这里是removef:

void StringList::removef(string s)
{
    int loc = Find(s,0,10000); //ignore these parameters, i know they are wrong they are just an example


        for(int j=loc; j<(numberOfStrings)-1; j++)
        {
            str[j] = str[j+1];
        }
        numberOfStrings--;

}
void StringList::removef(字符串s)
{
int loc=Find(s,010000);//忽略这些参数,我知道它们是错误的,它们只是一个例子

对于(int j=loc;j开始,我假设您已经对字符串'str'数组进行了排序……否则二进制搜索将无法工作

在“Find”函数中,您可以访问“str”数组,我假设它是字符串数组,但是您不会将此数组作为参数传递。因此,除非它是全局数组,否则尝试访问它将不起作用


最后,由于递归调用此函数,因此需要有一个case来处理数组中根本不包含的字符串。

我看到的一个问题是,当key大于middle元素时,您将新范围设置为
[midde,end]
,但它应该是
[middle+1,end]
-没有必要再考虑中间元素,因为您已经知道它不匹配

第一个条件应该是这样的:

if (key > str[middle])
{
    return Find(key,middle+1,end);
}
int loc = Find(s,0,numberOfStrings);
另外,正如其他人提到的,您需要检查字符串是否不在数组中。我建议在
Find
方法的开头添加类似的内容

if (start == end) return -1;
一旦将数组细分到起点等于终点,就没有更多的搜索空间,也就找不到字符串了

除此之外,我认为唯一可能错误的是,您使用错误的范围调用了
Find
方法

if (key > str[middle])
{
    return Find(key,middle+1,end);
}
int loc = Find(s,0,numberOfStrings);

这可能是一个愚蠢的问题,但是数组是否已排序?此外,如果字符串不在数组中,则Find函数将不起作用。@TaylorBrandstetter是的,它是由另一个函数按字母顺序排序的。至于Find not working,我将添加一个if语句,建议if not there返回-1。如果-1,它将打印“string not there”在这种情况下,我会在调用Find函数时检查它是否真的被排序。您的代码对排序后的数组适用。@TaylorBrandstetter不适用于我及其排序后的数组。我想我的错误在Find函数中。@TaylorBrandstetter是否与我在removef中调用Find时选择的参数有关函数?如上所述,我有一个名为StringList的类,其中包含str[]数组。我的顺序搜索有效。我的二分搜索无效。我可以简单地编写一个if语句来修复字符串不存在不存在它不存在@greysquall您救了我的命!错误是调用我的remove函数查找