STL-算法详解

STL算法是对容器进行处理的函数。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序 列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。
头文件

#include
#include

查找类算法

查找类算法 算法作用
find(beg,end val) 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的 一个迭代器。
find_end(beg,end,beg2,end2) 在迭代区间[beg,end) 内查找与区间[beg2, end2) 内任意元素匹配的元素,然后返回一个迭代器,指向最后一个匹配的元素。如果找不到元素,则返回第一个范围的end迭代器
find_first_of(beg,end,beg2,end2) 与find_ first_ of类似,区别:查找最后一个匹配的元素。
find_if(beg,end,val) 与find类似查找的不是一个值还是达成条件的值

直接代码加注释

template <typename IT,typename T>//模板实现find算法
IT mfind(const IT& first, const IT& last, const T& val)//返回类型迭代器
{
	IT tmp = first;//const允许修改定义零时变量 
	while (tmp != last)
	{
		if (*tmp == val)
		{
			return tmp;
		}
		tmp++;
	}
	return last;
}
template <typename IT ,typename PRE>//模板实现find_if函数
IT mfind_if(const IT& first, const IT& last, PRE pre)//find_if 返回迭代器
{
	IT tmp = first;//因为有const所以定义IT零时变量 tmp
	while (tmp != last)
	{
		if (pre(*tmp))
		{
			return tmp;
		}
		tmp++;
	}
	return last;
}
int main()
{
	vector<int> v1;//创建vector容器 v1
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i + 1);//初始化v1
	}
	cout << "用流式迭代器打印v1" << endl;
	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	cout << "使用find算法查询数字5" << endl;
	vector<int>::iterator it = find(v1.begin(), v1.end(), 5);
	if (it == v1.end())
	{
		cout << "not find" << endl;
	}
	else
	{
		cout << *it << endl;
	}
	vector<int> v2;//创建int类型vector v2
	copy(v1.begin(), v1.begin() + 4, inserter(v2, v2.begin()));//用copy对v2进行初始化,将v1.begin()到v1.begin()+4拷贝到v2
	cout << "打印初始化v2" << endl;
	copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));//用流式迭代器打印v2
	cout << endl;
	cout << "使用fing_end算法进行查找:" << endl;
	vector<int>::iterator it1 = find_end(v1.begin(), v1.end(), v2.begin(),v2.end());
	if (it1 == v1.end())
	{
		cout << "not find" << endl;
	}
	else
	{
		cout << *it1 << endl;
	}
	cout << "自己实现的find算法:" << endl;
	vector<int>::iterator it2 = mfind(v1.begin(), v1.end(), 5);//使用自己实现的find算法进行查找
	if (it1 == v1.end())
	{
		cout << "not find" << endl;
	}
	else
	{
		cout << *it2 << endl;
	}
	return 0;
}

STL-算法详解_第1张图片

排序类算法

排序类算法 算法作用
sort (beg,end) 区间[beg,end) 内元素按字典次序排列
stable_ sort(beg, end, func) 同上,不过保存相等元素之间的顺序关系
partial_ sort (beg,mid, end) 将最小值顺序放在[beg,mid)内
random_ shuffle (beg,end) 区间内元素随意排序
reverse (beg,end) 将区间内元素反转
rotate(beg,mid ,end) 将区间[beg, mid) 和[mid, end)旋转,使mid为新的起点
merge(beg, end, beg2. end2,nbeg) 将有序区间[beg, end)和[beg2, end2)合 并到一个新的序列nbeg中,并对其排序
    vector<int>v1;
	for (int i = 10; i > 0; i--)
	{
		v1.push_back(i);
	}
	cout << "v1初始化容器内元素顺序" << endl;
	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	cout << "使用sort排序之后:" << endl;
	sort(v1.begin(), v1.end());
	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	cout << "使用reverse进行翻转:" << endl;
	reverse(v1.begin(), v1.end());
	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));

STL-算法详解_第2张图片
可变按序列算法

可变序列算法 算法作用
copy(beg,end, beg2) 将迭代区间[beg, end) 元素复制到以beg2 开始的区间
transform (beg, end, beg2, func) 功能同上,只是每个元素需要经过函数func处理
repl ace(beg, end, v1, v2) 将区间[beg,end)内等于 v1的元素替换为v2
fill (beg,end, v) 区间内元素都写入v
fill_ _n(beg, n, v) 从位置beg开始的n个元素写入v
generate (beg,n,rand) 向从beg开始的n个位置随机填写数据
remove (beg,end) 移除区间[beg,end)内的元素, 注意:并不真正删除
unique(beg,end) 剔除相邻重复的元素,注意:并不真正删除
    vector<int>v1;
	for (int i = 10; i > 0; i--)
	{
		v1.push_back(i);
	}
	cout << "v1初始化容器内元素顺序" << endl;
	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	vector<int>v2;
	cout << "用copy初始化v2" << endl;
	copy(v1.begin(), v1.begin() + 4, inserter(v2, v2.begin()));//用copy对v2进行初始化,将v1.begin()到v1.begin()+4拷贝到v2
	copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
	cout << "用fill算法将v1值改为5" << endl;
	fill(v1.begin(), v1.end(), 5);
	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));

在这里插入图片描述
关系算法

关系算法 算法作用
equal (beg, end, beg2,end2) 判断两个区间元素是否相等
includes (beg,end,beg2,end2) 判断[beg,end) 序列是否被第二个序列[beg2, end2) 包含
max_ element (beg, en) 返回序列最大元素的位置
min_ element (beg, end) 返回序列最小元素的位置
mismatch (beg,end,beg2,end2) 查找两个序列中第- -一个不匹配的元素,返回一对iterator,标记第一个不匹配元素的位置
注意:使用includes前必须先进行排序
    vector<int>v1;
	for (int i = 10; i > 0; i--)
	{
		v1.push_back(i);
	}
	cout << "v1初始化容器内元素顺序" << endl;
	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	vector<int>v2;
	cout << "用copy初始化v2" << endl;
	copy(v1.begin(), v1.begin() + 4, inserter(v2, v2.begin()));//用copy对v2进行初始化,将v1.begin()到v1.begin()+4拷贝到v2
	copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	cout << "使用equal判断v1,v2" << endl;
	cout<<equal(v1.begin(), v1.end(), v2.begin(), v2.end());
	cout << endl;
	cout << "使用includes判断v1包含v2" << endl;
	sort(v1.begin(), v1.end());//先排序
	sort(v2.begin(), v2.end());
	if (includes(v2.begin(), v2.end(), v1.begin(), v1.end()))
	{
		cout << "include" << endl;
	}
	else
	{
		cout << "not include" << endl;
	}

STL-算法详解_第3张图片

堆算法

堆算法 算法作用
make_ heap (beg,end) 以区间[beg,end)内元素建立堆
pop_ heap (beg,end) 重新排序堆,使第-一个与最后- 一个交换,并不真正弹出最大值
push_ heap(beg, end) 重新排序堆,把新元素放在最后一个位置
sort_ heap(beg, end) 对序列重新排序

	vector<int> v;
	v.push_back(3);
	v.push_back(9);
	v.push_back(17);
	v.push_back(20);
	v.push_back(12);

	make_heap(v.begin(), v.end()); //用 vector 代替数组建立最大堆
	cout << "堆前: ";
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
		cout << *iter << " ";
	cout << endl;

	cout << "堆排序后: ";
	sort_heap(v.begin(), v.end()); //堆排序
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
		cout << *iter << " ";
	

在这里插入图片描述

你可能感兴趣的:(#,STL,数据结构,算法,stl,c++)