文章内容转载自黑马程序员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交换容器时,注意交换的容器要同种类型