2020.11.20 第12课 STL算法篇

本文深入讲解了C++ STL中的各种算法,包括查找、排序、删除、替换等,并提供了丰富的示例代码来展示这些算法的应用场景。

2020.11.20 第12课 STL算法篇

一、STL算法总结


 使用算法容器 重载一些标准
 查找算法
	adjacent_find : 查重复数,返回首个元素iter  
	bianry_search: 二分查找
	count: 区间统计
	count_if: 范围查找统计个数
	equal: 比较
	equal_range :区间元素比较
	find:区间查找元素		!!!!!
	find_first_of:区间查找第一次出现值
	find_if : 条件查找
	upper_bound:查找最后一个大于等于val的位置
	lower_bound: 查找第一个大于等于val的位置
	search:子序列查找位置
	search_n:子序列查找出现次数
排序和通用算法:
	merge: 归并排序,存于新容器
	inpace_merge: 归并排序,覆盖原区间
	sort: 排序,更改原容器顺序			!!!!!
	stable_sort: 排序,保存原容器数据顺序
	nth_element: 关键字排序
	partition:范围排序
	partial_sort:范围排序
	partial_sort_copy:范围排序外加复制操作
	stable_partition: 范围排序,保存原容器顺序
	random_shuffle: 随机排序
	reverse:逆序原容器
	reverse_copy: 逆序容器保存到新容器
	rotate:移动元素到容器末尾
	rotate_copy:移动元素到新容器
删除和替换
	copy: 拷贝函数				!!!!!!!
	copy_backward: 逆序拷贝
	iter_swap: 交换
	remove: 删除
	remove_copy: 删除元素复制到新容器
	remove_if:条件删除
	remove_copy_if:条件删除拷贝到新容器
	replace:替换
	replace_copy: 替换,结果放到新容器
	replace_if: 条件替换
	replace_copy_if:条件替换,结果另存
	swap: 交换
	swap_range:区间交换
	unique:去重
	unique_copy:去重,结果另存
求和    用到某种算法时根据情况
	accumulate:区间求和		!!!!
	partial_sum:相邻元素的和
	inner_product:序列内积运算
	adjacent_difference:相邻元素的差
生成和异变
	for_each:迭代访问
	fill:填充方式初始容器
	fill_n:指定长度填充容器
	generate_n:填充前n个位置
	transform:一元转换和二元转换   做大小写转换

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <numeric>  //和 积 差
#include <string>
#include <functional>
using namespace std;
void print(int data)
{
	cout << data << "\t";
}
struct MM
{
	string name;
	int age;
	int num;
	bool operator==(MM two)
	{
		return this->name == two.name;
	}
	bool operator==(string str)
	{
		return this->name == str;
	}
	bool operator<(MM two)
	{
		return this->name < two.name;
	}
};
class myString
{
public:
	myString(int capacity = 15)
	{

	}
protected:
	char* str;
	int sizeStr;
	int capacity;
};
int main()
{
	vector<int> array(3);
	for (int i = 0; i < 3; i++)
	{
		array[i] = 2;
	}
	sort(array.begin(), array.end());				  //从小到大
	sort(array.begin(), array.end(),greater<int>());  //从大到小
	sort(array.begin(), array.end(),less<int>());     //从小到大
	//for_each()
	//copy()结合流型迭代器做打印
	//统计元素个数
	cout << accumulate(array.begin(), array.end(), 100) << endl;
	//100表示的求和的初始值
	cout << count(array.begin(), array.end(), 2) << endl;			
	cout << *find(array.begin(), array.end(), 2) << endl;
	if (find(array.begin(), array.end(), 100) == array.end())
	{
		cout << "未找到元素" << endl;
	}
	list<MM> myList;
	MM mmData[4] = { "yy",18,1001,"lbw",18,1001,"大力",18,1001,"baby",18,1001 };
	for (int i = 0; i < 4; i++)
		myList.push_back(mmData[i]);
	//MM string
	list<MM>::iterator iter=find(myList.begin(), myList.end(), mmData[2]);  //mmData[i]
	cout << iter->name << "\t" << iter->age << "\t" << iter->num << endl;
	//MM ==string
	iter = find(myList.begin(), myList.end(), "大力");  //string类型  结构体类型
	cout << iter->name << "\t" << iter->age << "\t" << iter->num << endl;
	//list不能使用 要用成员函数的sort算法
	myList.sort(); // < 默认的都是小于号 重载一下小于号  自定义类型

	//归并算法 归并两个有序数列
	vector<int> str1(3);
	str1[0] = 1;
	str1[1] = 3;
	str1[2] = 5;
	vector<int> str2(3);
	str2[0] = 2;
	str2[1] = 4;
	str2[2] = 6;
	vector<int> str3(6);
	merge(str1.begin(), str1.end(), str2.begin(), str2.end(), str3.begin());
	for_each(str3.begin(), str3.end(), print);
	cout << endl;
	copy(str3.begin(), str3.end(), ostream_iterator<int>(cout, " "));
	ostream_iterator<string> object(cout);
	object = "Iloveyou";
	cout << endl;

	//string --->串
	//了解一下,很少这样用
	string love = "Iloveyou";
	cout << love.c_str() << endl;			 //转换为char* 
	string::iterator strIter = love.begin();
	for (; strIter != love.end(); strIter++)
	{
		cout << *strIter;
	}
	cout << endl;
	string saveStr(love); //不赋值没有申请内存
	transform(love.begin(), love.end(), saveStr.begin(),tolower);
	cout << saveStr << endl;
	transform(love.begin(), love.end(), saveStr.begin(), toupper);
	cout << saveStr << endl;
	cout << saveStr.capacity() << endl;	//容量 默认容量 超过扩增
	cout << saveStr.size() << endl;		//长度  不算\0 可见长度 不是字符串

	string str;
	cout << str.capacity() << endl;  
    //图形化 并集差集
	return 0;
}

二、堆算法

/*
堆:一段内存 随便拿随便取
	1.堆算法
		make_heap;
		sort_heap;
		pop_heap;
	大顶堆 小顶堆 二叉树  数据和数组序号满足
*/
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
void print(int data)
{
	cout << data << " ";
}
int main()
{
	int array[] = { 1,4,5,6,23,56,76 };
	vector<int> vec;
	vec.assign(array, array + 7);
	//sort_heap(vec.begin(),vec.end());		堆排序一定是要形成堆后才排序
	for_each(vec.begin(), vec.end(), print);
	make_heap(vec.begin(), vec.end());  //默认方式是大顶堆
	cout << endl;
	for_each(vec.begin(), vec.end(), print);
	cout << endl;
	sort_heap(vec.begin(), vec.end());
	for_each(vec.begin(), vec.end(), print);
	cout << endl << vec.size() << endl;
	pop_heap(vec.begin(), vec.end());
	for_each(vec.begin(), vec.end(), print);

	vector<int> lessHeap;
	lessHeap.assign(array, array + 7);
	sort(lessHeap.begin(), lessHeap.end()); //小顶堆
	cout << endl;
	for_each(lessHeap.begin(), lessHeap.end(),print);
	pop_heap(lessHeap.begin(), lessHeap.end(), greater<int>());
	cout << endl;
	//如何描述一个出栈的方式:
	while (!lessHeap.empty())
	{
		pop_heap(lessHeap.begin(), lessHeap.end(), greater<int>());
		cout << lessHeap.back() << endl;
		lessHeap.pop_back();   //--->删除出堆 //push_back 插入  pop_back: 删除
	}
	//50 最少张数  20  10  10 5 5 
	//2 2 5 5 10 10 20
	//2 2 5 5 10 10 
	//2 2 5 5 10
	return 0;
}

三、交集和并集

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void print(int data)
{
	cout << data << " ";
}
int main()
{
	int array[] = { 1, 3, 4, 7, 9 };
	int array2[] = { 3,4,5,6,9 };
	vector<int> data1;
	data1.assign(array, array + 5);
	vector<int> data2;
	data2.assign(array2, array2 + 5);
	vector<int> data3(data1.size() + data2.size());
	//把数据放到set中
	set_union(data1.begin(), data1.end(), data2.begin(), data2.end(),
		data3.begin());
	for_each(data3.begin(), data3.end(), print);
	cout << endl;
	vector<int> data5(data3);
	set_intersection(data1.begin(), data1.end(), data2.begin(), data2.end(),
		data5.begin());
	for_each(data5.begin(), data5.end(), print);
	cout << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值