C++中如何使用copy_if進(jìn)行條件復(fù)制

c++
小樊
81
2024-09-25 01:19:23

std::copy_if 是 C++ 標(biāo)準(zhǔn)庫(kù)中的一個(gè)算法,它用于從一個(gè)輸入范圍復(fù)制滿足特定條件的元素到另一個(gè)輸出范圍。其基本語(yǔ)法如下:

template< class InputIt, class OutputIt, class UnaryPredicate >
OutputIt copy_if( InputIt first, InputIt last, OutputIt d_first, UnaryPredicate p );

這里,InputItOutputIt 是迭代器類型,表示輸入和輸出范圍;UnaryPredicate 是一個(gè)一元謂詞,即接受單個(gè)參數(shù)的函數(shù)或函數(shù)對(duì)象,用于定義復(fù)制條件。

下面是一個(gè)使用 std::copy_if 的示例,將一個(gè) std::vector 中所有大于 5 的元素復(fù)制到另一個(gè) std::vector 中:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main() {
    std::vector<int> src = {1, 6, 3, 8, 2, 10};
    std::vector<int> dest;

    // 預(yù)分配足夠的空間以提高性能
    dest.reserve(src.size());

    // 使用 std::copy_if 復(fù)制大于 5 的元素
    std::copy_if(src.begin(), src.end(), std::back_inserter(dest), [](int x) { return x > 5; });

    // 輸出結(jié)果
    for (int num : dest) {
        std::cout << num << ' ';
    }

    return 0;
}

在這個(gè)示例中,我們使用了 lambda 表達(dá)式 [](int x) { return x > 5; } 作為謂詞,它定義了復(fù)制條件為“元素值大于 5”。std::back_inserter(dest) 用于將復(fù)制的元素插入到 dest 的末尾。注意,我們還使用了 dest.reserve() 來(lái)預(yù)分配足夠的空間以提高性能,因?yàn)?std::back_inserter 會(huì)導(dǎo)致多次內(nèi)存分配。

0