繁体   English   中英

在char字符串数组上应用c ++“ lower_bound”

[英]Applying c++ “lower_bound” on an array of char strings

我正在尝试C ++中的lower_bound函数。 对于1 d数据类型多次使用它。

现在,我正在sorted array dict[5000][20]尝试查找size <=20字符串。 要匹配的字符串在str

bool recurseSerialNum(char *name,int s,int l,char (*keypad)[3],string str,char (*dict)[20],int 
dictlen)

{


    char (*idx)[20]= lower_bound(&dict[0],&dict[0]+dictlen,str.c_str());

    int tmp=idx-dict;

    if(tmp!=dictlen)
        printf("%s\n",*idx);

}

根据http://www.cplusplus.com/reference/algorithm/lower_bound/?kw=lower_bound ,如果未找到匹配项,则该函数应返回“ last”(末尾)的索引,即tmp应该相等dictlen 在我的情况下,它总是返回开始指数即我得到tmp equal to 0两者1.当传递一个字符串,它是存在于dict和2当传递一个字符串,它是不存在的dict

我认为问题在于指针的处理和传递。 default comparator在这种情况下应该可用,在矢量情况下也可以使用。 我也尝试通过一个明确的尝试,但无济于事。

我尝试了这个比较器-

bool compStr(const char *a, const char *b){
    return strcmp(a,b)<0;
}

我知道ALTERNATE是用于矢量等的,但是我想知道这一问题。 通过Google以及SO搜索了此内容,但未找到任何类似内容。

我相信这里有两个误解。

  1. std::lower_bound不检查元素是否属于已排序范围。 相反,它找到可以在不破坏顺序的情况下插入元素的最左边的位置。
  2. 您不是在比较字符串的内容,而是它们的内存地址。

的确,在您的情况下, dict是一个排序范围,即内部数组的内存地址在递增。 与这个str.c_str()有关的位置当然是未定义的。 实际上, dict是一个堆栈对象,您通常会发现堆的内存范围str.c_str()始终位于str.c_str()处)低于堆栈的内存范围,在这种情况下, lower_bound很正确地告诉您是否要将此地址插入您解释dict的地址的排序范围内,您必须在一开始就这样做。

对于解决方案,由于有一个operator<(char const *, std::string const &) ,您可以简单地编写

char (*idx)[20] = lower_bound(&dict[0], &dict[0] + dictlen, str);

...但是您也许真的在寻找std::find吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM