我在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上搜索了这个,但是没有找到类似的东西。
答案 0 :(得分:1)
我相信这里有两个误解。
std::lower_bound
不检查元素是否是排序范围的一部分。相反,它会找到可以插入元素的最左边的位置,而不会破坏顺序。在你的情况下,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
?