c++中remove_if()與remove()有何區(qū)別

c++
小樊
85
2024-09-25 05:54:17

在 C++ 標(biāo)準(zhǔn)庫(kù) <algorithm> 中,remove_if()remove() 都是用于處理容器中元素的方法,但它們的實(shí)現(xiàn)和行為有所不同。

  1. remove() 方法: remove() 方法用于移除容器中所有等于指定值的元素。它并不真正刪除這些元素,而只是將不需要?jiǎng)h除的元素移到容器的前面,并返回一個(gè)指向“新”末尾的迭代器。要真正刪除這些元素,需要使用容器的 erase() 方法。

示例代碼:

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

int main() {
    std::vector<int> v = {1, 2, 3, 2, 4, 2, 5};
    
    auto new_end = std::remove(v.begin(), v.end(), 2);
    
    v.erase(new_end, v.end());
    
    for (int x : v) {
        std::cout<< x << ' ';
    }
    
    return 0;
}

輸出:

1 3 4 5
  1. remove_if() 方法: remove_if() 方法用于移除滿(mǎn)足指定條件的所有元素。與 remove() 不同,remove_if() 接受一個(gè)謂詞函數(shù)(即一個(gè)返回布爾值的函數(shù)或函數(shù)對(duì)象),并使用該謂詞函數(shù)來(lái)判斷哪些元素應(yīng)該被移除。

示例代碼:

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

bool is_even(int x) {
    return x % 2 == 0;
}

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    auto new_end = std::remove_if(v.begin(), v.end(), is_even);
    
    v.erase(new_end, v.end());
    
    for (int x : v) {
        std::cout<< x << ' ';
    }
    
    return 0;
}

輸出:

1 3 5 7 9

總結(jié):

  • remove() 用于移除等于指定值的元素,而 remove_if() 用于移除滿(mǎn)足指定條件的元素。
  • remove()remove_if() 都不會(huì)真正刪除元素,而是將不需要?jiǎng)h除的元素移到容器的前面。要真正刪除這些元素,需要使用容器的 erase() 方法。
  • remove_if() 更加靈活,因?yàn)樗梢越邮苋魏螡M(mǎn)足要求的謂詞函數(shù)。

0