文章内容转载自黑马程序员C++提高编程讲义,如有侵权,请联系作者删除
5.3 常用排序算法
学习目标:
算法简介:
sort
//对容器内元素进行排序
random_shuffle
//洗牌 指定范围内的元素随机调整次序
merge
// 容器元素合并,并存储到另一容器中
reverse
// 反转指定范围的元素
5.3.1 sort
功能描述:
函数原型:
sort(iterator beg, iterator end, _Pred);
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// _Pred 谓词
示例:
#include <algorithm> #include <vector>
void myPrint(int val) { cout << val << " "; }
void test01() { vector<int> v; v.push_back(10); v.push_back(30); v.push_back(50); v.push_back(20); v.push_back(40);
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; }
|
总结:sort属于开发中最常用的算法之一,需熟练掌握
5.3.2 random_shuffle
功能描述:
函数原型:
示例:
#include <algorithm> #include <vector> #include <ctime>
class myPrint { public: void operator()(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洗牌算法比较实用,使用时记得加随机数种子
5.3.3 merge
功能描述:
函数原型:
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 容器元素合并,并存储到另一容器中
// 注意: 两个容器必须是有序的
// beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2
容器2开始迭代器 // end2 容器2结束迭代器 // dest
目标容器开始迭代器
示例:
#include <algorithm> #include <vector>
class myPrint { public: void operator()(int val) { cout << val << " "; } };
void test01() { vector<int> v1; vector<int> v2; for (int i = 0; i < 10 ; i++) { v1.push_back(i); v2.push_back(i + 1); }
vector<int> vtarget; vtarget.resize(v1.size() + v2.size()); merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin()); for_each(vtarget.begin(), vtarget.end(), myPrint()); cout << endl; }
int main() {
test01();
system("pause");
return 0; }
|
总结:merge合并的两个容器必须的有序序列
5.3.4 reverse
功能描述:
函数原型:
示例:
#include <algorithm> #include <vector>
class myPrint { public: void operator()(int val) { cout << val << " "; } };
void test01() { vector<int> v; v.push_back(10); v.push_back(30); v.push_back(50); v.push_back(20); v.push_back(40);
cout << "反转前: " << endl; for_each(v.begin(), v.end(), myPrint()); cout << endl;
cout << "反转后: " << endl;
reverse(v.begin(), v.end()); for_each(v.begin(), v.end(), myPrint()); cout << endl; }
int main() {
test01();
system("pause");
return 0; }
|
总结:reverse反转区间内元素,面试题可能涉及到
5.4 常用拷贝和替换算法
学习目标:
算法简介:
copy
// 容器内指定范围的元素拷贝到另一容器中
replace
// 将容器内指定范围的旧元素修改为新元素
replace_if
//
容器内指定范围满足条件的元素替换为新元素
swap
// 互换两个容器的元素
5.4.1 copy
功能描述:
函数原型:
copy(iterator beg, iterator end, iterator dest);
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// dest 目标起始迭代器
示例:
#include <algorithm> #include <vector>
class myPrint { public: void operator()(int val) { cout << val << " "; } };
void test01() { vector<int> v1; for (int i = 0; i < 10; i++) { v1.push_back(i + 1); } vector<int> v2; v2.resize(v1.size()); copy(v1.begin(), v1.end(), v2.begin());
for_each(v2.begin(), v2.end(), myPrint()); cout << endl; }
int main() {
test01();
system("pause");
return 0; }
|
总结:利用copy算法在拷贝时,目标容器记得提前开辟空间
5.4.2 replace
功能描述:
函数原型:
示例:
#include <algorithm> #include <vector>
class myPrint { public: void operator()(int val) { cout << val << " "; } };
void test01() { vector<int> v; v.push_back(20); v.push_back(30); v.push_back(20); v.push_back(40); v.push_back(50); v.push_back(10); v.push_back(20);
cout << "替换前:" << endl; for_each(v.begin(), v.end(), myPrint()); cout << endl;
cout << "替换后:" << endl; replace(v.begin(), v.end(), 20,2000); for_each(v.begin(), v.end(), myPrint()); cout << endl; }
int main() {
test01();
system("pause");
return 0; }
|
总结:replace会替换区间内满足条件的元素
5.4.3 replace_if
功能描述:
函数原型:
示例:
#include <algorithm> #include <vector>
class myPrint { public: void operator()(int val) { cout << val << " "; } };
class ReplaceGreater30 { public: bool operator()(int val) { return val >= 30; }
};
void test01() { vector<int> v; v.push_back(20); v.push_back(30); v.push_back(20); v.push_back(40); v.push_back(50); v.push_back(10); v.push_back(20);
cout << "替换前:" << endl; for_each(v.begin(), v.end(), myPrint()); cout << endl;
cout << "替换后:" << endl; replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000); for_each(v.begin(), v.end(), myPrint()); cout << endl; }
int main() {
test01();
system("pause");
return 0; }
|
总结:replace_if按条件查找,可以利用仿函数灵活筛选满足的条件
5.4.4 swap
功能描述:
函数原型:
示例:
#include <algorithm> #include <vector>
class myPrint { public: void operator()(int val) { cout << val << " "; } };
void test01() { vector<int> v1; vector<int> v2; for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i+100); }
cout << "交换前: " << endl; for_each(v1.begin(), v1.end(), myPrint()); cout << endl; for_each(v2.begin(), v2.end(), myPrint()); cout << endl;
cout << "交换后: " << endl; swap(v1, v2); for_each(v1.begin(), v1.end(), myPrint()); cout << endl; for_each(v2.begin(), v2.end(), myPrint()); cout << endl; }
int main() {
test01();
system("pause");
return 0; }
|
总结:swap交换容器时,注意交换的容器要同种类型