STL常用算法

概述:

算法主要由头文件<algorithm><functional><numeric>组成。
* <algorithm>是所有STL头文件中最大的一个,范围涉及到比较,交换,查找,遍历操作,复制,修改等等
* <numeric>体积很小,只包括几个序列上面进行简单数学运算的模板函数
* <functional>定义了一些模板类,用以声明函数对象。

掌握常用的遍历算法


for_each 遍历容器


 函数原型:for_each(iterator beg,iterator end,_func);
_func函数或者函数对象

总结:for_each是实际开发中最常用的 必须要熟练掌握!

 transform遍历容器 

搬运容器到另外一个容器中

总结:搬运目标容器需要提前开辟空间,否则无法开辟! 

常见查找算法


find //查找元素
find_if //按条件查找元素
adjacent_find //查找相邻重复元素
binary_search //二分查找法
count //统计元素个数
count_if //按条件统计元素个数

常用查找算法 find:

功能描述:
* 查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
* 函数原型:
* find(iterator beg,iterator end,value);
* //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* beg 开始迭代器
* end结束迭代器
* value查找的元素

常用查找算法-find_if

功能描述:按条件查找元素
* 函数原型:find_if(iterator beg,iterator end,_pred);
* //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* //_pred 函数或者谓词(返回bool类型的仿函数)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*find_if
* 功能描述:按条件查找元素
* 函数原型:find_if(iterator beg,iterator end,_pred);
* //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* //_pred 函数或者谓词(返回bool类型的仿函数)*/
//内置数据类型查找
//普通函数
bool print(int val) {
	return val>5;}
void test01() {
	vector<int> v;
	for (int i = 0;i<=6;i++) {
		v.push_back(i);
	}
	vector<int>::iterator pos = find_if(v.begin(),v.end(),print);
	if (pos != v.end()) {
		cout << "找到了 " << *pos << endl;
	}
	else cout<<"没有找到!" << endl;
}
//自定义数据类型查找
class person {
public:
	person(string name, int age) {
		m_name = name;
		m_age = age;
	}
	//重载:
	bool operator==(const person& p){
		if (p.m_age == this->m_age && p.m_name == this->m_name)
			return true;
		else return false;
	}
	bool operator()(person& p) {
		return p.m_age > 18;
	}
	string m_name;
	int m_age;
};
class Myprint {
public:
	bool operator()(person &p) {
		return p.m_age >18;
	}
};
void test02() {
	vector<person> v1;
	person p1("1",18);
	person p2("2", 16);
	person p3("1", 19);
	v1.push_back(p1);
	v1.push_back(p2);
	v1.push_back(p3);
	vector<person>::iterator pos = find_if(v1.begin(), v1.end(),Myprint());
	if (pos != v1.end()) {
		cout << "找到了 "  << endl;
	}
	else cout << "没有找到!" << endl;
}
int main() {
	//test01();
	test02();
	return 0;
}

常用查找算法-adjacent_find

功能描述:
* 查找相邻重复元素
* 函数原型:
* adjacent_find(iterator beg,iterator end);
* 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
* beg开始迭代器
* end结束迭代器


总结:面试题中如果出现查找相邻重复元素,记得用STL中的adjacent_find算法

常用查找算法-binary_search

功能描述:
* 查找指定元素是否存在
* 函数原型:bool binary_search(iterator beg,iterator end,value);
* //查找指定的元素,查到返回true 否则false
* //注意:在无序序列中不可用
beg 开始迭代器
end结束迭代器
value 查找的元素 

总结:注意:在无序序列中不可用

常用查找算法- count

功能描述:统计元素个数
* 函数原型:count(iterator beg,iterator end,value);
统计元素出现次数
beg开始迭代器
end结束迭代器
value统计的元素
总结:统计自定义数据类型时候,需要配合重载operator==

 总结:统计自定义数据类型时候,需要配合重载operator==

常用查找算法count_if


* 功能描述:按条件统计元素个数
* 函数原型:count_if(iterator beg,iterator end, _pred);
按条件统计元素出现次数
beg开始迭代器
end结束迭代器
_pred 谓词

 常用排序算法

 学习目标:掌握常用的排序算法
* 算法简介:
* sort();对容器内元素进行排序
* random_shuffle 洗牌 指定范围内的元素随机调整次序
* merge 容器元素合并,并存储到另外一个容器中
* reverse 反转指定范围的元素

常用排序算法-sort

功能描述:
* 对容器内元素进行排序
* 函数原型:
* sort(iterator beg,iterator end,_pred);
* 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* beg 开始迭代器
* end 结束迭代器
* _pred 谓词

 总结:sort算法是开发中常用的,需熟练掌握。

常用排序算法—random_shuffle


* 功能描述:洗牌 指定范围内的元素随机调整次序
* 函数原型:random_shuffle(iterator beg,iterator end);
* 指定范围内的元素随机调整次序

总结:这个算法非常实用,用之前记得加时间种子! 

常用排序算法—merge

功能描述:两个容器元素合并,并存储到另外一个容器中
函数原型:merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
容器元素合并,并存储到另外一个容器中
注意:两个容器必须是有序的
dest开始目标迭代器


总结:注意:两个容器必须是有序的,并且目标容器需要提前分配空间!

常用排序算法—reverse


功能描述:将容器内元素进行反转
函数原型:reverse(iterator beg,iterator end);
反转指定范围的元素

 总结:比较常用,面试题可能会遇到。

常用的拷贝和替换算法

学习目标:掌握常用的拷贝和替换算法
* 算法简介:copy //容器内指定范围的元素拷贝到另外容器中
* replace 将容器内指定范围的旧元素修改为新元素
* replace_if 容器内指定范围满足条件的元素替换为新元素
* swap 互换两个容器的元素

常用拷贝迭代器和替换算法copy

功能描述;容器内指定范围的元素拷贝到另外一个容器中
* 函数原型:
* copy(iterator beg,iterator end,iterator dest);
* 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置


总结:利用copy算法在拷贝的时候,目标容器记得提前开辟空间!

 常用拷贝迭代器和替换算法replace

功能描述:将容器内指定范围的旧元素修改为新元素
* 函数原型:
* replace(iterator beg,iterator end,oldvalue,newvalue);
* 将区间内旧元素替换成新元素
* beg开始迭代器
* end结束迭代器
* oldvalue旧元素
* newvalue新元素


总结:replace会替换区间内满足条件的元素

 常用拷贝迭代器和替换算法replace_if


* 功能描述:将区间内满足条件的元素,替换成指定元素
* 函数原型:replace_if(iterator beg,iterator end,_pred,newvalue);
_pred 谓词
newvalue替换的新元素 

 

总结:replace_if按条件查找,可以利用谓词仿函数灵活筛选满足的条件

 常用拷贝迭代器和替换算法swap


功能描述:互换两个容器的元素
函数原型:swap(container c1,container c2);
互换两个容器的元素
c1容器1
c2容器2

 总结:互换的两个容器必须同类型容器,且数据类型要相同!

 常用算术生成算法-accumulate


* 功能描述:计算区间内容器元素累计总和
* 函数原型:
* accumulate(iterator beg,iterator end,value);
* 计算容器元素累计总和
* value起始值


总结:accumulate使用时头文件注意是numeric,这个算法很使用。

常用算术生成算法—fill


* 功能描述:
* 向容器中填充指定的元素
* 函数原型:fill(iterator beg,iterator end,value);
向容器中填充元素
value 填充的值
利用fill可以将容器区间内元素填充为指定的值

 

 总结:利用fill可以将容器区间内元素填充为指定的值。

常用集合算法概念:

学习目标:掌握常用的集合算法
* 算法简介:

set_intersection 求两个容器的交集
* set_union 求两个容器的并集
* set_difference 求两个容器的差集

常用集合算法—set_intersection


* 功能描述:求两个容器的交集
函数原型:set_intersection(iterator beg1,interator end1,iterator beg2,iterator end2,iterator dest);
求两个集合的交集
注意:两个集合必须是有序序列
beg1容器1开始迭代器
end1容器1结束迭代器
beg2容器2开始迭代器
end2容器2结束迭代器
dest 目标容器开始迭代器
函数返回的是交集结束迭代器位置


总结:注意:两个集合必须是有序序列,开辟目标容器时选两个容器中最小值,set_intersection()函数返回的是交集结束迭代器位置.

常用集合算法—set_union


* 功能描述:求两个集合的并集
* 函数原型:set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
求两个集合的并集
注意:两个集合必须是有序序列
dest目标容器开始迭代器


总结:求并集的两个集合必须是有序序列
目标容器开辟空间需要两个容器相加
set_union返回值即是并集中最后一个元素的位置。 

常用集合算法—set_difference

函数原型:set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
* 求两个集合的差集


* 总结:求差集的两个集合必须是有序序列
* 目标容器开辟空间需要从两个容器中取较大者
* set_differenece返回值是差值中最后一个元素的位置 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值