2018年12月26日 星期三

[C/C++][STL][C#]集合處理筆記-常用函式對應


稍微整理一下,日常常摸的集合處理需要:





工具運算子C++11(STL)C#(.NET用途範例分類
找集合內符合條件Predicatefind_if()Find()在多個向量中找符合單位長度的向量(第一個)Non-modifying sequence operations(不更動序列順序/內容)
對每個元素執行操作Actionfor_each()ForEach()輸出向量內容Non-modifying sequence operations(不更動序列順序/內容
檢測集合內所有元素是否都符合條件Predicateall_of()All()是否每個向量皆為單位向量Non-modifying sequence operations(不更動序列順序/內容
檢測集合內是否至少有一元素符合條件Predicateany_of()Any()集合內至少有一向量與參考向量正交Non-modifying sequence operations(不更動序列順序/內容
計算集合內符合條件的元素數量Predicatecount()Count()集合內符合單位向量定義的向量數量Non-modifying sequence operations(不更動序列順序/內容
集合型態轉換UnaryOperatortransform()Select()轉換向量長
Modifying sequence operations(原序列內容更動
集合順序累加成單一元素BinaryOperatorAggrerate()多組向量拼成矩陣


對應的運算子列表:



C++11(STL)
C#(.NET

運算子名稱原型名稱原型備註
PredicateUnaryPredicatebool foo(T element)Predicate<T>bool foo(T element)
ActionFunctionvoid foo(T element)Actionvoid foo(T element)
UnaryOperatorUnaryOperatorT2 foo(T1 element)

Func<TSource,TResult>

Func<TSource,TResult>回傳值型別TResult
BinaryOperatorN/AN/AFunc<TAccumulate,TSource,TAccumulate>Func<TAccumulate,TSource,TAccumulate>回傳值型別TAccumulate

做了一點小小練習,操作STL容器-array,元素為自定義的結構MyVector,用來表達簡單的二維向量;並且用STL-algorithm操作匯總輸出/找單位向量/算向量長,熟用集合處理的話就都是一行斬喔

#include<algorithm>
#include<array>
#include<math.h>
#include<iostream>

using namespace std;

typedef struct myVector
{
    float x;
    float y;
} MYVECTOR;

bool thePredicate(MYVECTOR vector)
{
    return sqrt(pow(vector.x,2)+pow(vector.y,2)) == 1;
}
void theAction(MYVECTOR vector)
{
    printf("%f,%f\n",vector.x,vector.y);
}
float theUnaryOperator(MYVECTOR vector)
{
    return sqrt(pow(vector.x,2)+pow(vector.y,2));
}
int main(int argc, char const *argv[])
{
    std::array<MYVECTOR,5> v;
    std::array<float,5> lengths;

    v[0].x = 2; v[0].y = 3;
    v[1].x = 4; v[1].y = 5;
    v[2].x = 6; v[2].y = 7;
    v[3].x = 0; v[3].y = 1;

    std::array<MYVECTOR,5>::iterator it =  std::find_if(v.begin(),v.end(),thePredicate);
    theAction(*it);

    std::for_each(v.begin(),v.end(),theAction);
    std::transform(v.begin(),v.end(),lengths.begin(),theUnaryOperator);

    return 0;
}

參考1:STL algorithms
參考2: MSDN - Collection.Generic / Linq

沒有留言:

張貼留言