高階篇 STL中通用演算法處理資料

2021-07-31 12:40:49 字數 3557 閱讀 4883

1. for_each()演算法遍歷容器元素

形象地講,for_each()演算法像乙個漏斗裝置,用具體的處理方法來做漏斗的漏紙,把容器中指定的元素遍歷倒入漏斗,將符合處理方法的容器元素進行處理

void addsalary(int& nsalary)	//員工工資低於2000的漲30% 

}vectorvecsalary;

vecsalary.push_back(3200);

vecsalary.push_back(1983);

vecsalary.push_back(703);

for_each(vecsalary.begin(), vecsalary.end(), addsalary); //使用for_each演算法對容器中指定範圍的資料進行遍歷處理,處理方法為addsalary

2. 用find()和find_if()演算法實現線性查詢

如果找到,返回指向這個元素的迭代器,否則返回這個容器的末尾位置

find():

vectorvecgoods; //商品資訊的容器 

vecgoods.push_back("eraser");

vecgoods.push_back("pencil");

vecgoods.push_back("pen");

string str = "ruler" //定義要購買的商品,老闆進行查詢

vector::iterator it = vecgoods.find(vecgoods.begin(), vecgoods.end(), str); //find()函式

if(it != vecgoods.end())

cout<

bool ispass(int n) //用函式定義查詢規則

vectorvecscores;

vecscores.push_back(72);

vecscores.push_back(54);

vecscores.push_back(87);

vector::iterator it = vecscores.begin(); //定義查詢的起始位置

do //利用迴圈,逐個查詢容器中符合條件的資料

vectorvecscores;

vecscores.push_back(72);

vecscores.push_back(54); //不及格

vecscores.push_back(87);

vecscores.push_back(-1); //缺考

remove(vecscores.begin(), vecscores.end(), -1); //刪除所有缺考的成績

replace(vecscores.begin(), vecscores.end(), isfail, 60); //將所有不及格的成績替換為60

4. 容器元素的複製與變換:copy()演算法和merge()演算法

copy():將乙個容器的元素複製到另外乙個容器中去。三個引數:源容器的起始與終止位置,目標容器的起始位置

//三個引數:源容器的起始與終止位置,目標容器的起始位置

//正向複製copy(),從目標起始位置向後放置資料

vectorvecscorec1;

vectorvecscorec2; //儲存c1、c2班級成績的兩個容器

vectorvecscore; //儲存所有成績的總容器

vecscore.resize() = vecscorec1.size() + vecscorec2.size(); //重新設定總容器的容量

vector::iterator lastit = copy(vecscorec1.begin(), vecscorec1.end(), vecscore.begin()); //將c1容器的資料複製到總容器中

copy(vecscorec2.begin(), vecscorec2.end(), lastit);//將c2容器的資料追加到vectorscore的末尾lastit

//逆向複製copy_backward(),從目標起始位置向前放置資料

merge():除了使用copy()煩瑣地逐個複製元素實現兩個容器的合併之外,stl提供merge()專門用來講兩個源容器的資料合併到目標容器的演算法。在使用merge()演算法進行合併之前,必須使用sort()演算法對兩個源容器中的資料進行排序

vectorvecscorec1; 

vectorvecscorec2; //儲存c1、c2班級成績的兩個容器

vectorvecscore; //儲存所有成績的總容器

sort(vecscorec1.begin(), vecscorec1.end());

sort(vecscorec2.begin(), vecscorec2.end()); //sort()排序先

vecscore.resize() = vecscorec1.size() + vecscorec2.size(); //重新設定總容器的容量

merge(vecscorec1.begin(), vecscorec1.end(), vecscorec2.begin(), vecscorec2.end(), vecscore.begin());

5. set_union演算法:合併兩個源容器,相同資料只保留乙份

//set_union()實現資料元素的不重複,只能出現一次的將源容器資料合併到目標容器中,當然使用前同樣要sort()排序 

vectorvecgoods; //總商品清單

vectorvecstation; //文具類清單

vectorvecoffice; //辦公類清單

vecstation.push_back("pen");

vecstation.push_back("pencil");

vecoffice.push_back("folder");

vecoffice.push_back("pen");

vecgoods.resize(vecstation.size() + vecoffice.size());

sort(vecstation.begin(), vecstation.end());

sort(vecoffice.begin(), vecoffice.end());

//set_union()演算法返回的是指向合併後的目標容器中最後乙個資料的迭代器

vector::iterator itend = set_union( vecstation.begin(), vecstation.end(),

vecoffice.begin(), vecoffice.end(), vecgoods.begin() );

for(auto it = vecgoods.begin(); it!=itend; ++it)

cout<

6. 變換容器元素:transform函式

資料處理 一些比賽中通用的函式

這篇文章主要記載一些非具體化的函式操作,以及一些加速,壓縮等可用可不用的函式,具體到專案的資料處理函式詳情見其他文章。def reduce mem usage df,verbose true numerics int16 int32 int64 float16 float32 float64 sta...

STL中的基本資料結構與演算法

目錄 二 常用演算法 入門篇 stl standard template library 是c 的標準模板庫,很多競賽常用的資料結構 演算法在stl中都有,熟練掌握能極大簡化程式設計。stl的容器分為兩類 順序式 序列容器 底層主要採用向量和鍊錶 常見的有 vector list stack que...

演算法與資料結構 博弈論(高階篇之SG博弈)

sg博弈的命名源於sg函式和sg定理,而sg函式的出現則來自於乙個簡單的取石子遊戲 有1堆n個的石子,每次只能取個石子,先取完石子者勝利,判斷對於不同的n,先手能否取勝?分析 這個遊戲和巴什博弈的不同在於 sg博弈中取東西是無規則不連續的,而巴什博弈中取東西則是連續的 因此在討論sg博弈時要複雜很多...