進階篇_STL中通用演算法處理資料

Pop_Rain發表於2017-05-03

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

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

void addsalary(int& nsalary)	//員工工資低於2000的漲30% 
{
	if(nsalary < 2000)
	{
		nsalary *= 1.3;
	}
}

vector<int> vecsalary;
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():

vector<string> vecgoods; //商品資訊的容器 
vecgoods.push_back("eraser");
vecgoods.push_back("pencil");
vecgoods.push_back("pen");

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

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

if(it != vecgoods.end())
	cout<<*it<<endl;
else
	cout<<"沒有ruler商品"<<endl;
find_if(),有時候並不一定想找某個特定的資料而是能夠找到符合某種條件的資料:

bool ispass(int n)	//用函式定義查詢規則 
{
	return n>=60;
}

vector<int> vecscores;
vecscores.push_back(72);
vecscores.push_back(54);
vecscores.push_back(87);

vector<int>::iterator it = vecscores.begin();	//定義查詢的起始位置 
do	//利用迴圈,逐個查詢容器中符合條件的資料 
{
	it = find_if(it, vecscores.end(), ispass);	//find_if()來查詢符合條件的資料,返回指向條件為true的迭代器或者容器末尾 
	if(it != vecscores.end())
	{
		cout<<"找到及格分數:"<<(*it)<<endl;
		++it;
	}
	else
		break;
}while(true);

3. remove()和replace()演算法:

bool isfail(int n)	//用函式定義查詢規則 
{
	return n<60;
}

vector<int> vecscores;
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(),從目標起始位置向後放置資料
vector<int> vecscoreC1; 
vector<int> vecscoreC2; //儲存C1、C2班級成績的兩個容器 
vector<int> vecscore; //儲存所有成績的總容器

vecscore.resize() = vecscoreC1.size() + vecscoreC2.size(); //重新設定總容器的容量
vector<int>::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()演算法對兩個源容器中的資料進行排序

vector<int> vecscoreC1; 
vector<int> vecscoreC2; //儲存C1、C2班級成績的兩個容器 
vector<int> vecscore; //儲存所有成績的總容器

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()排序 
vector<string> vecgoods; //總商品清單
vector<string> vecstation; //文具類清單
vector<string> vecoffice;  //辦公類清單

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<string>::iterator itend = set_union( vecstation.begin(), vecstation.end(), 
							vecoffice.begin(), vecoffice.end(), vecgoods.begin() );
							
for(auto it = vecgoods.begin(); it!=itend; ++it)
	cout<<*it<<endl;	//輸出合併後的商品 

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




相關文章