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

时间:2015-01-05 09:14:07

标签: c++ string pointers multidimensional-array lower-bound

我在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,如果未找到匹配项,则此函数应返回&#39; last&#39;(超越结束)的索引,即tmp应该相等{{1 }}。 在我的例子中,它总是返回起始索引,即我得到dictlen两者1.当传递tmp equal to 0中的字符串时,以及2.传递dict中不存在的字符串时1}}。

我认为问题在于处理和传递指针。对于这种情况,dict应该可用,如同vector一样。我也尝试过一个明确的,但没有用。

我试过这个比较器 -

default comparator

我知道bool compStr(const char *a, const char *b){ return strcmp(a,b)<0; } 是使用矢量等,但我想知道这个问题。 在google和SO上搜索了这个,但是没有找到类似的东西。

1 个答案:

答案 0 :(得分:1)

我相信这里有两个误解。

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