C++——STL常用算法

一、概述

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

二、常用遍历算法

①for_each
函数原型

for_each(iterator beg,iterator end,_func);

beg:开始迭代器
end:结束迭代器
_func:函数对象或函数

②transform
功能描述:搬运容器到另一个容器中。
函数原型

transform(iterator beg1,iterator end1,iterator beg2,_func);

beg1:源容器开始迭代器
end1:源容器结束迭代器
beg2:目标容器开始迭代器
_func:函数或者函数对象

三、查找算法

①find
功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end();
函数原型:

find(iterator beg,iterator end,value);

beg:开始迭代器
end:结束迭代器
value:查找的元素

当查找自定义数据类型时,需要重载==号,让底层find知道如何对比person数据类型
eg:

class person
{
public:
	
	person(string name, int age) {
		this->name = name;
		this->age = age;
	}

	//重载==
	bool operator==(const person& p) {
		if (this->name == p.name && this->age == p.age) {
			return true;
		}
		else {
			return false;
		}
	}

	string name;
	int age;
};

void test()
{
	vector<person> a;
	person p1("小红", 12);
	person p2("小明", 13);
	person p3("小东", 10);
	person p4("小东", 10);

	a.push_back(p1);
	a.push_back(p2);
	a.push_back(p3);

	vector<person>::iterator it = find(a.begin(), a.end(), p4);
	if (it == a.end()) {
		cout << "未找到" << endl;
	}
	else {
		cout << "找到了" << endl;
	}

}

②find_if
功能描述:按条件查找元素
函数原型:

find_if(iterator beg,iterator end,_Pred);

beg开始迭代器
end结束迭代器
_Pred函数或者谓词(返回bool类型的仿函数)

自定义数据类型

class person
{
public:
	
	person(string name, int age) {
		this->name = name;
		this->age = age;
	}

	string name;
	int age;
};

class my_compare
{
public:
	bool operator()(person& p) {
		return p.age > 15;
	}
};

void test()
{
	vector<person> a;
	person p1("小红", 12);
	person p2("小明", 16);
	person p3("小东", 17);

	a.push_back(p1);
	a.push_back(p2);
	a.push_back(p3);

	//找到一个年龄>15岁的
	vector<person>::iterator it= find_if(a.begin(), a.end(), my_compare());
	while (it != a.end()) {
		cout << "姓名:" << (*it).name << "年龄:" << (*it).age << endl;
		it++;
	}
	
	

}

③adjacent_find
功能描述:查找相邻重复元素
注意:在无序序列中不可用
函数原型:

adjacent_find(iterator beg,iterator end);

beg开始迭代器
end结束迭代器

返回值:查到相邻元素,返回相邻元素的第一个位置的迭代器

④binary_search
功能描述:查找指定元素是否存在
函数原型:

bool binary_search(iterator beg,iterator end,value);

beg开始迭代器
end结束迭代器
value查找的元素

返回值:查到返回true,否则false;

⑤count
功能描述:统计元素个数
函数原型:

count(iterator beg,iterator end,value);

beg开始迭代器
end结束迭代器
value统计的元素

统计自定义数据类型:

class person
{
public:

	person(string name, int age) {
		this->name = name;
		this->age = age;
	}
	
	//重载==号
	bool operator==(const person &p) {
		if (p.age == this->age) {
			return true;
		}
		else {
			return false;
		}
	}

	string name;
	int age;
};

void test()
{
	vector<person> a;
	person p1("小红", 16);
	person p2("小明", 16);
	person p3("小东", 17);
	person p4("小花", 19);
	person p5("小6", 19);

	a.push_back(p1);
	a.push_back(p2);
	a.push_back(p3);
	a.push_back(p4);

	int ret = count(a.begin(), a.end(), p5);
	cout << ret << endl;

}

⑥count_if
功能描述:按条件统计元素个数
函数原型:

count_if(iterator beg,iterator end,_Pred);

beg开始迭代器
ned结束迭代器
_Pred谓词

自定义数据类型:

class person
{
public:

	person(string name, int age) {
		this->name = name;
		this->age = age;
	}
	

	string name;
	int age;
};

class my_compare
{
public:
	bool operator()(const person &p1) {
		return p1.age > 15;
	}
};

void test()
{
	vector<person> a;
	person p1("小红", 16);
	person p2("小明", 16);
	person p3("小东", 17);
	person p4("小明", 16);


	a.push_back(p1);
	a.push_back(p2);
	a.push_back(p3);
	a.push_back(p4);

	int ret=count_if(a.begin(), a.end(), my_compare());
	cout << ret << endl;

}

四、排序算法

①sort
功能介绍:对容器内元素进行排序(默认从小到大)
函数原型:

sort(iterator beg,iterator end,_Pred);

beg开始迭代器
end结束迭代器
_Pred谓词

返回值:按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置。

②random_shuffle
功能介绍:指定范围内的元素随机调整次序
函数原型:

random_shuffle(iterator beg,iterator end);

beg开始迭代器
end结束迭代器

③merge
功能介绍:容器元素合并,并存储到另一容器中
注意:两个容器都必须是有序的。
函数原型:

merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);

beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器

④reverse
功能介绍:将容器内元素进行反转
函数原型:

reverse(iterator beg,iterator end);

beg 开始迭代器
end 结束迭代器

五、拷贝和替换算法

①copy
功能介绍:容器内指定范围的元素拷贝到另一容器中
注意:目标容器需要提前开辟空间
函数原型:

copy(iterator beg,iterator end,iterator dest);

②replace
功能介绍:将容器内指定范围的旧元素修改为新元素
函数原型:

replace(iterator beg,iterator end,oldvalue,newvalue);

beg 开始迭代器
end 结束迭代器
oldvalue 旧元素
newvalue 新元素

③replace_if
功能介绍:按条件替换元素,满足条件的替换成指定元素
函数原型:


beg 开始迭代器
end 结束迭代器
_pred 谓词
newvalur 替换的元素

④swap
功能介绍:互换两个容器的元素
函数原型:

swap(container c1,container c2);

c1:容器1
c2:容器2

六、常用算术生产算法

算术生产算法属于小型算法,使用时包含的头文件为<numeric>
①accumulate
功能介绍:计算容器元素累计总和
函数原型:

accmulate(iterator beg,iterator end,value);

beg 开始迭代器
end 结束迭代器
value 起始值

②fill
功能介绍:向容器中添加元素
函数原型:

fill(iterator beg,iterator end,value)

beg 开始迭代器
end 结束迭代器
value 填充的值

七、常用集合算法

两个集合必须都是有序序列

①set_intersection
功能介绍:求两个容器的交集
需要为目标容器开辟空间,最特殊情况:大容器包含小容器

vector<int>a;
vector<int>b;
vector<int>Target;
Target.resize(min(a.size(),b.size());	//min是寻找小容器

函数原型:

set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);

beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器

返回值:交集中最后一个元素的位置

②set_union
功能介绍:求两个容器的并集
需要为目标容器开辟空间,最特殊情况:两个容器没有交集

vector<int>a;
vector<int>b;
vector<int>Target;
Target.resize(a.size()+b.size());

函数原型:

set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);

beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器

③set_difference
功能介绍:求两个容器的差集
需要为目标容器开辟空间,最特殊情况:两个容器没有交集,取两个容器中大的size作为目标容器开辟的空间

vector<int>a;
vector<int>b;
vector<int>Target;
Target.resize(max(a.size(),b.size());	//max是寻找大容器

函数原型:

set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);

beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器

你可能感兴趣的:(C++,c++)