[英]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搜索了此内容,但未找到任何类似内容。
我相信这里有两个误解。
std::lower_bound
不检查元素是否属于已排序范围。 相反,它找到可以在不破坏顺序的情况下插入元素的最左边的位置。 的确,在您的情况下, 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.