根據關于的檔案std::lower_bound,其中說:
范圍 [first, last) 必須根據運算式
element < valueorcomp(element, value)進行磁區,即運算式所針對的true所有元素必須在運算式所針對的所有元素之前false。完全排序的范圍符合此標準。
我很難完全理解它。
1.是element < value什么?在上述檔案中,本段之前似乎從未提及element(或)。value是否表示element當前元素之前的元素,表示value當前元素的值?
更新:
2.由于特定序列是否有效(即是否符合要求)取決于value,當值不同時,不能始終保證特定序列的要求。我認為定義這樣的要求是沒有意義的。似乎完全排序的序列更可靠和實用。
uj5u.com熱心網友回復:
什么是元素<值
value是 的引數lower_bound,請參見該頁面的開頭:
模板< class ForwardIt, class T > ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
這里value提到了有問題的,模板的最后一個引數。并且,對序列中的element某個元素和每個元素的參考。
這是定義以下內容的相當簡潔的方法:獲取element序列中的每一個,一次一個元素。當您這樣做時,運算式element < value回傳 true 的所有元素必須出現在序列中的所有其他元素之前,對于相同的運算式為 false。以這種方式定義需求是明確有意的,以下是解釋:
例如,如果value是4,并且我們正在談論自然整數,這是一個這樣的序列:
1, 2, 3, 4, 5, 6
在這里,該運算式為真的所有元素(1、2 和 3)都出現在該運算式為假的所有元素(4、5 和 6)之前。
以下序列也是有效序列,在這種情況下:
3, 2, 1, 6, 5, 4
在這里,同樣的事情:運算式為真的 3、2 和 1出現在運算式為假element < 4的值 4、5 和 6 之前。element < 4所以,是的,這也是呼叫4 值的有效序列。lower_bound
對于這種使用的特定情況,以下序列將不是有效序列std::lower_bound:
1, 2, 4, 3, 5, 6
至于為什么lower_bound以如此奇怪的方式指定此要求,那將是一個不同的問題。但這就是它的意思。
uj5u.com熱心網友回復:
來自cppreference
回傳一個迭代器,該迭代器指向范圍 [first, last) 中不小于(即大于或等于)值的第一個元素,如果沒有找到這樣的元素,則回傳 last。
范圍 [first, last) 必須根據運算式 element < value 或 comp(element, value) 進行劃分,即運算式為真的所有元素必須在運算式為假的所有元素之前。完全排序的范圍符合此標準。
從你的問題:
什么是元素<值?似乎在上述檔案的本段之前從未提及元素(或值)。所述元素是指當前元素之前的元素,而所述值是指當前元素的值嗎?
value并comp在頁面開頭的函式簽名中提到。value是您呼叫的引數std::lower_bound,以及comp一個可選的比較函式;不應該提供比較功能,<而是使用。
element指范圍內的每個元素[first, last)。
因此,要做的是與范圍內的sstd::lower_bound進行比較,直到找到第一個不是“小于”的值(通過or )。valueelement<compvalue
作業的要求std::lower_bound是輸入范圍以這樣一種方式進行磁區,即所有“小于”的元素 value都放在其余元素之前;例如,如果范圍已完全排序,則滿足該要求。
(正如@Passerby 在下面的評論中提到的那樣,由于磁區范圍的要求,std::lower_bound不需要與所有“小于”的元素進行比較value,但這是一個實作細節。)
uj5u.com熱心網友回復:
磁區
值串列可以根據某些標準進行磁區或分組。例如:
┌────┬────┬────┬────┬────┬────┬────┬────┐
| 2 | 7 | 3 | -5 | 11 | 94 | 15 | 12 |
└────┴────┴────┴────┴────┴────┴────┴────┘
x < 10 | x ≥ 10
在此串列中,我們有兩個磁區:
- x < 10 的元素
- x 不 < 10 的元素
此外,該標準意味著一個順序:
- 所有滿足 (x < 10) 的 xs 都在 -之前- 所有 xs 滿足 !(x < 10)
(在 C 中,我們傾向于使用“比較器”或“比較函式”來指定標準。)
請注意,每個磁區中元素相對于彼此的順序無關緊要!也就是說,還值得注意的是,如果對串列進行了排序,它仍然會有完全相同的兩個磁區:
┌────┬────┬────┬────┬────┬────┬────┬────┐
| -5 | 2 | 3 | 7 | 11 | 12 | 15 | 94 |
└────┴────┴────┴────┴────┴────┴────┴────┘
x < 10 | x ≥ 10
(我這里的示例有兩個大小相等的磁區。情況不一定如此。一個磁區可能有零個或多個元素,并且每個磁區的大小可能與其他磁區不同。)
下界→磁區開始的索引
該lower_bound演算法所做的是找到現有磁區的第一個元素。
該演算法需要的唯一警告是,必須已經以排序標準有意義的方式對序列進行磁區。(因為演算法只找到磁區,它不排序東西!)
例如,我們的原始序列不支持將元素分為 (x < 7) 和 (x ≥ 7) 的標準,因為元素不是以這種方式劃分的——試圖找到“第一個”是沒有意義的不存在的磁區的元素。
這就是 cppreference.com 使用的語言的含義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425950.html
