這裏有C++STL——全面總結詳細教程(附案例解析)(持續更新中)
常用排序算法
學習目標:
-
掌握常用的排序算法
算法簡介:
sort
//對容器內元素進行排序random_shuffle
//洗牌 指定範圍內的元素隨機調整次序merge
// 容器元素合併,並存儲到另一容器中reverse
// 反轉指定範圍的元素
sort
功能描述:
-
對容器內元素進行排序
函數原型:
sort(iterator beg, iterator end, _Pred);
- // 按值查找元素,找到返回指定位置迭代器,找不到返回結束迭代器位置
- // beg 開始迭代器
- // end 結束迭代器
- // _Pred 謂詞
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
void MyPrint(int val) {
cout << val << " ";
}
void test01(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(4);
v.push_back(5);
v.push_back(3);
v.push_back(4);
v.push_back(4);
sort(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
random_shuffle
功能描述:
-
洗牌 指定範圍內的元素隨機調整次序
函數原型:
random_shuffle(iterator beg, iterator end);
- // 指定範圍內的元素隨機調整次序
- // beg 開始迭代器
- // end 結束迭代器
#include<iostream>
#include<vector>
#include<string>
#include<ctime>
#include<algorithm>
using namespace std;
void MyPrint(int val) {
cout << val << " ";
}
void test01(){
srand((unsigned int)time(NULL));
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
總結:random_shuffle洗牌算法比較實用,使用時記得加隨機數種子。
接下來把合併與反轉放在一起講解。
merge
功能描述:
-
兩個容器元素合併,並存儲到另一容器中
函數原型:
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
- // 容器元素合併,並存儲到另一容器中
- // 注意: 兩個容器必須是有序的
- // beg1 容器1開始迭代器// end1 容器1結束迭代器// beg2 容器2開始迭代器// end2 容器2結束迭代器// dest 目標容器開始迭代器
reverse
功能描述:
-
將容器內元素進行反轉
函數原型:
-
reverse(iterator beg, iterator end);
// 反轉指定範圍的元素
// beg 開始迭代器
// end 結束迭代器
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class MyPrint {
public:
void operator()(int val){
cout << val << " ";
}
};
void test01(){
vector<int>v;
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
v1.push_back(i + 1);
}
vector<int>vTarget;
vTarget.resize(v.size() + v1.size());
merge(v.begin(), v.end(), v1.begin(), v1.end(), vTarget.begin());
for_each(vTarget.begin(), vTarget.end(), MyPrint());
cout << endl;
reverse(vTarget.begin(), vTarget.end());
for_each(vTarget.begin(), vTarget.end(), MyPrint());
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
總結:merge合併的兩個容器必須的有序序列。
注意:合併前。我們必須先給新容器分配大小。