記錄 C++ STL 中 一些好用的函式--持續更新 (for_each,transform,count_if,find_if)

deepwzh發表於2017-03-25

在日常的程式設計中,有這麼幾種操作還是比較常見的:

把一組資料都賦值成一個數,在一組資料中查詢一個數,統計一組資料中符合條件的數等等。

一般的寫法可以用迴圈,沒有什麼是迴圈不能搞定的。假如在這裡怎麼用介紹迴圈寫,估計要被說騙點選率了。。。

首先,對於批量賦值,我們有這樣的幾個函式可以用

1.memset(cstring)

適用於內建資料型別陣列的批量賦值,因為它是按照位元組賦值的,所以對於int型別只可以賦值為-1,0,對於char型別可以賦值為任意字元

例:memset(A,0,sizeof(A));//A為int[10]型別變數

2.fill(algorithm)

適用於內建型別陣列,自定義型別陣列(只支援一維陣列)和容器類。因為它是按照單元賦值的,因此可以為陣列中每一個元素賦值為任何合法值。在過載了類中=運算子之後,我們還可以將容器內物件批量賦值為一個物件值。

fill(A,A+10,5); //A為 int[10]型別變數

fill(vec.begin(),vec.end(),9); //vec 為vector<int>型別

3.for_each(algorithm)

適用於任何容器以及陣列,可定製性功能強,可以利用自定義函式或者自定義仿函式進行操作(包括賦值,輸出值等等)

例:

#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
class setNode{
    Node u;
    public:
    setNode(Node u):u(u){}
    void operator ()(Node & node) {
        node = u;
    }
};
void print(Node & u){
    printf("(%d,%d)\n",u.x,u.y);
}
int main(){
    vector<Node> vec;
    vec.push_back(Node(1,2));
    vec.push_back(Node(3,4));
    for_each (vec.begin(),vec.end(),setNode(Node(1,2)));
    for_each (vec.begin(),vec.end(),print);
    return 0;
}

 

相關文章