簡體   English   中英

在char字符串數組上應用c ++“ lower_bound”

[英]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搜索了此內容,但未找到任何類似內容。

我相信這里有兩個誤解。

  1. std::lower_bound不檢查元素是否屬於已排序范圍。 相反,它找到可以在不破壞順序的情況下插入元素的最左邊的位置。
  2. 您不是在比較字符串的內容,而是它們的內存地址。

的確,在您的情況下, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM