使用 std::max_element 並傳入自訂比較函數 ab(實際為 a > b),預期找出最大值,卻輸出容器中的最小值 0。
bool ab(int mem1, int mem2) {
return mem1 > mem2; // 看似「大於」判斷
}
int main() {
std::vector vec = {7, 0,1,2,3,4,5,6,7,8,9};
std::cout << *std::max_element(vec.begin(), vec.end(), ab) << std::endl; // 輸出 0
}
std::max_element 內部邏輯為:
if (comp(*it, *max_it)) // comp 為傳入的謂詞
max_it = it;
它假設謂詞代表 「嚴格弱序」中的「小於」關係(即 comp(a,b) 為真表示 a 在 b 之前)。
std::less(預設)時,a < b 符合預期,找到最大值。ab(即 a > b)時,comp(a,b) 為真代表 a > b,演算法會把「較大」的元素視為「較小」而保留,最終選出的是原意義上的最小值。std::less 或 [](a,b){ return a < b; }。std::min_element 搭配 std::less,或用 std::max_element 搭配 std::greater(注意 std::greater 定義為 a > b,同樣會反轉語意)。std::ranges::max_element 搭配投影與比較器,語意更清晰。「謂詞永遠定義『先後順序』,
max_element找的是『序列尾端』的元素。」