首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ STL `max_element` 搭配自訂二元謂詞:為何傳入 `greater` 卻得到最小值?

     編輯:程式設計綜合問答

問題現象

使用 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,同樣會反轉語意)。
  • C++20 可用 std::ranges::max_element 搭配投影與比較器,語意更清晰。

核心口訣

「謂詞永遠定義『先後順序』,max_element 找的是『序列尾端』的元素。」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved