[英]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.