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

STL algorithm 算法 copy_if 詳細解析

     編輯:C++ 入門

STL algorithm 算法 copy_if 詳細解析

函數原型

template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
                       OutputIterator result, UnaryPredicate pred);

功能描述

將範圍 `[first, last)` 中滿足一元謂詞 `pred` 返回 `true` 的元素複製到以 `result` 開始的目標範圍。相當於篩選複製操作。

等價實現

template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
                       OutputIterator result, UnaryPredicate pred) {
    while (first != last) {
        if (pred(*first)) {
            *result = *first;
            ++result;
        }
        ++first;
    }
    return result;
}

參數說明

參數說明
first, last輸入迭代器,指定源範圍 `[first, last)`
result輸出迭代器,目標範圍起始位置
pred一元謂詞,接受元素返回 bool,true 表示複製該元素

返回值

指向最後複製元素之後位置的輸出迭代器。

使用示例

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    vector<int> v1{1, 5, 7, 8, 9, 10, 14, 15};
    vector<int> v2;
    v2.resize(10);  // 預分配空間
    
    // 複製大於 8 的元素
    auto it = copy_if(v1.begin(), v1.end(), v2.begin(),
                     [](int x) { return x > 8; });
    
    cout << "複製結果: ";
    for (auto i = v2.begin(); i != it; ++i)
        cout << *i << " ";
    cout << endl;
    
    return 0;
}

運行結果

複製結果: 9 10 14 15 

注意事項

  • 目標範圍必須有足夠空間,否則會越界
  • 輸入和輸出範圍不應重疊
  • 謂詞函數不應修改元素
  • C++11 起標準庫提供,早期版本需自行實現

應用場景

  • 容器篩選:提取滿足條件的元素到新容器
  • 數據清洗:過濾無效數據
  • 配合 back_inserter 避免預分配空間
// 更推薦的用法:配合 back_inserter
vector<int> v2;
copy_if(v1.begin(), v1.end(), back_inserter(v2),
        [](int x) { return x > 8; });
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved