首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++11 新增算法詳解:all_of、any_of、none_of、find_if_not、copy_if、iota、minmax_element、is_sorted 等

     編輯:C++ 入門

判斷類算法

算法功能返回
all_of(first, last, pred)區間所有元素滿足 predbool(全真為 true)
any_of(first, last, pred)區間至少一個元素滿足 predbool(存在為 true)
none_of(first, last, pred)區間無元素滿足 predbool(全假為 true)

示例:all_of(v.begin(), v.end(), [](int x){return x%2;}) 判斷全為奇數。

查找類算法

  • find_if_not(first, last, pred):尋找**不**滿足 pred 的第一個元素,等價於 find_if(first, last, not1(pred)) 但更清晰、無需定義否定謂詞。

拷貝類算法

  • copy_if(first, last, out, pred):僅拷貝滿足 pred 的元素到輸出迭代器,返回輸出區間末尾。配合 resize(distance(...)) 截斷多餘空間。

生成類算法

  • iota(first, last, value):用遞增序列填充區間(value, value+1, ...)。需預先分配足夠空間(vector v(n); iota(v.begin(), v.end(), 1);)。

極值類算法

  • minmax_element(first, last):同時返回最小值和最大值迭代器的 pair,單次遍歷完成,比分別調用 min_element/max_element 更高效。

有序性檢查算法

代碼示例綜合

#include 
#include 
#include 
#include  // iota
using namespace std;

int main() {
    vector v = {1,3,5,7,9,4};
    auto isOdd = [](int x){ return x%2; };
    cout << "all_of: " << all_of(v.begin(), v.end(), isOdd) << "\n"; // false
    cout << "any_of: " << any_of(v.begin(), v.end(), [](int x){return x%2==0;}) << "\n"; // true
    cout << "none_of: " << none_of(v.begin(), v.end(), [](int x){return x%2==0;}) << "\n"; // false
    
    auto it = find_if_not(v.begin(), v.end(), isOdd); // 找第一個偶數
    if (it != v.end()) cout << "first even: " << *it << "\n";
    
    vector odds(v.size());
    auto end = copy_if(v.begin(), v.end(), odds.begin(), isOdd);
    odds.resize(distance(odds.begin(), end));
    // odds = {1,3,5,7,9}
    
    vector v2(4);
    iota(v2.begin(), v2.end(), 1); // {1,2,3,4}
    
    auto mm = minmax_element(v.begin(), v.end());
    cout << "min=" << *mm.first << ", max=" << *mm.second << "\n";
    
    auto pos = is_sorted_until(v.begin(), v.end());
    for (auto it=v.begin(); it!=pos; ++it) cout << *it << ' '; // 1 3 5 7 9
    cout << "\nis_sorted: " << is_sorted(v.begin(), v.end()) << "\n"; // 0
}

總結

C++11 算法庫新增項目針對常見模式(全量判斷、條件拷貝、序列生成、雙極值、有序檢查)提供標準化、可讀性強、性能優化的組件,配合 Lambda 表達式極大提升代碼表達力,建議優先使用而非手寫循環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
算法功能
is_sorted(first, last)判斷整個區間是否已排序(非遞減)
is_sorted_until(first, last)返回指向**第一個破壞有序性**位置的迭代器(即最長有序前綴的末尾)