0

我正在尝试 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使用矢量等,但我想知道这个问题。通过谷歌和SO搜索了这个,但没有找到类似的东西。

4

1 回答 1

2

我相信这里有两个误解。

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

确实,dict在您的情况下,内部数组的内存地址在升序的意义上是一个排序范围。当然,与此相关的str.c_str()地方是不确定的。在实践中,dict是一个堆栈对象,您经常会发现堆的内存范围(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

于 2015-01-05T09:25:09.403 回答