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博弈時要複雜很多...