C++算法

算法由头文件<algorithm><functional><numeric>组成

<algorithm>比较、交换、查找、遍历、复制、修改等

<functional>简单数学运算

<numeric>声明函数对象

遍历算法

for_each 

遍历容器

  • for_each(iterator beg, iterator end, _func);
  • beg开始迭代器
  • end结束迭代器
  • _func函数或函数对象
//普通函数
void print_1(int val)
{
	cout << val << " ";
}
 
//仿函数
class print_2
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
void test()
{
	vector<int>v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	//普通函数遍历
	for_each(v.begin(), v.end(), print_1);
	cout << endl;
 
	//仿函数遍历
	for_each(v.begin(), v.end(), print_2());
	cout << endl;
}

transform

搬运容器到另一个容器,目标容器必须提前开辟空间

  • transform(iterator beg1, iterator end1, iterator beg2, _func);
  • beg1源容器开始迭代器
  • end1源容器结束迭代器
  • beg2目标容器开始迭代器
  • _func函数或函数对象
class print_vector
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
 
class Transform
{
public:
	int operator()(int val)
	{
		return val;
	}
};
void test()
{
	vector<int>v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	
	vector<int>v_target; //目标容器
	v_target.resize(v.size()); //目标容器提前开辟空间
	transform(v.begin(), v.end(), v_target.begin(), Transform());
	for_each(v_target.begin(), v_target.end(), print_vector());
}

查找算法

find

查找元素。找到返回指定元素的迭代器,找不到返回结束迭代器end()。查找自定义数据类型必须重载==运算符

  • find(iterator beg, iterator end, value);
  • beg开始迭代器
  • end结束迭代器
  • valeu查找的元素
//查找 内置数据类型
void test1()
{
	vector<int>v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	
	vector<int>::iterator it = find(v.begin(), v.end(), 5);
	if (it == v.end()) {
		cout << "没有找到" << endl;
	}
	else {
		cout << "找到了:" << *it << endl;
 
	}
}
 
//查找 自定义数据类型
class Person
{
public:
	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
 
	//重载 == 底层find 对比Person数据类型
	bool operator==(const Person &p)
	{
		if (this->m_name == p.m_name && this->m_age == p.m_age) {
			return true;
		}
		else {
			return false;
		}
	}
 
	string m_name;
	int m_age;
};
 
void test2()
{
	vector<Person>v;
	Person p1("a", 1);
	Person p2("b", 2);
	Person p3("c", 3);
	Person p4("d", 4);	
 
	 Person p1("a", 1); Person p2("b", 2); Person p3("c", 3); Person p4("d", 4); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
 
	vector<Person>::iterator it = find(v.begin(), v.end(),p2);
	if (it == v.end()) {
		cout << "没有找到" << endl;
	}
	else {
		cout << "找到了:" << it->m_name << it->m_age << endl;
	}
}

find_if

按条件查找元素。找到返回指定元素的迭代器,找不到返回结束迭代器end()。

  • find_if(iterator beg, iterator end, _Pred);
  • beg开始迭代器
  • end结束迭代器
  • _Pred函数或谓词(返回bool类型的仿函数)
//查找 内置数据类型
class greater_five
{
public:
	bool operator()(int val)
	{
		return val > 5;
	}
};
 
void test1()
{
	vector<int>v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
 
	vector<int>::iterator it = find_if(v.begin(), v.end(), greater_five());
	if (it == v.end()) {
		cout << "can't find it" << endl;
	}
	else {
		cout << "find it " << *it << endl;
	}
}
 
//查找 自定义数据类型
class Person
{
public:
	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
 
	string m_name;
	int m_age;
};
 
class greator_two
{
public:
	bool operator()(const Person &p)
	{
		if (p.m_age > 2) {
			return true;
		}
		else {
			return false;
		}
	}
};
 
void test2()
{
	vector<Person>v;
	Person p1("a", 1); 
	Person p2("b", 2); 
	Person p3("c", 3); 
	Person p4("d", 4); 
	
	v.push_back(p1); 
	v.push_back(p2); 
	v.push_back(p3); 
	v.push_back(p4);
 
	//找到年龄大于2的人
	vector<Person>::iterator it = find_if(v.begin(), v.end(), greator_two());
	if (it == v.end()) {
		cout << "can't find it" << endl;
	}
	else {
		cout << "find it " << it->m_name << " " << it->m_age << endl;
	}
}

adjacent_find

查找相邻重复元素。找到返回相邻元素的第一个位置的迭代器,找不到返回结束迭代器end()。

  • adjacent_find(iterator beg, iterator end);
  • beg开始迭代器
  • end结束迭代器
void test()
{
	vector<int>v;
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	v.push_back(2);
	v.push_back(3);
	v.push_back(3);
 
	vector<int>::iterator it = adjacent_find(v.begin(), v.end());
	if (it == v.end()) {
		cout << "没有找到相邻重复元素" << endl;
	}
	else {
		cout << "找到相邻重复元素:" << *it << endl; //3
	}
}

binary_search

二分查找法。找到返回true,找不到返回false。容器必须是有序的序列。

  • bool binary_search(iterator beg, iterator end, value);
  • beg开始迭代器
  • end结束迭代器
  • value查找的元素
void test()
{
	vector<int>v;
 
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
 
	//查找是否有 9 元素
	//容器必须有序,如果无序,结果未知
	bool pos = binary_search(v.begin(), v.end(), 9);
	if (pos == 0) {
		cout << "未找到" << endl;
	}
	else {
		cout << "找到了" << endl;
	}
}

count

统计元素个数

  • count(iterator beg, iterator end, value);
  • beg开始迭代器
  • end结束迭代器
  • value统计的元素
//统计 内置数据类型
void test1()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(10);
	v.push_back(10);
	v.push_back(20);
 
	int num = count(v.begin(), v.end(), 10);
	cout << "容器中10元素个数: " << num << endl;
}
 
//统计 自定义数据类型
class Person
{
public:
	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
 
	bool operator==(const Person &p)
	{
		if (this->m_age == p.m_age) {
			return true;
		}
		else {
			return false;
		}
	}
	string m_name;
	int m_age;
};
 
void test2()
{
	vector<Person>v;
	Person p1("a", 1); 
	Person p2("b", 2); 
	Person p3("c", 3); 
	Person p4("d", 3); 
 
	v.push_back(p1); 
	v.push_back(p2); 
	v.push_back(p3); 
	v.push_back(p4);
 
	Person p("x", 3);
 
	int num = count(v.begin(), v.end(), p);
	cout << "和x年龄相同的个数:" << num << endl;
}

count_if

按条件统计元素个数

  • count_if(iterator beg, iterator end, _Pred);
  • beg开始迭代器
  • end结束迭代器
  • _Pred谓词
//统计 内置数据类型
class greater_20
{
public:
	bool operator()(int val)
	{
		return val > 20;
	}
};
 
void test1()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(10);
	v.push_back(10);
	v.push_back(20);
	v.push_back(40);
 
	int num = count_if(v.begin(), v.end(), greater_20());
	cout << "容器中大于20元素个数: " << num << endl;
}
 
//统计 自定义数据类型
class Person
{
public:
	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
 
	string m_name;
	int m_age;
};
 
class greater_2
{
public:
	bool operator()(const Person &p)
	{
		if (p.m_age > 2) {
			return true;
		}
		else {
			return false;
		}
	}
};
 
void test2()
{
	vector<Person>v;
	Person p1("a", 1); 
	Person p2("b", 2); 
	Person p3("c", 3); 
	Person p4("d", 3); 
 
	v.push_back(p1); 
	v.push_back(p2); 
	v.push_back(p3); 
	v.push_back(p4);
 
 
	int num = count_if(v.begin(), v.end(), greater_2());
	cout << "年龄大于2的个数:" << num << endl;
}

排序算法

sort

对容器内元素进行排序,不加谓词默认排序从小到大。

  • sort(iterator beg, iterator end, _Pred);
  • beg开始迭代器
  • end结束迭代器
  • _Pred谓词
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v;
 
	v.push_back(10);
	v.push_back(30);
	v.push_back(40);
	v.push_back(20);
	v.push_back(50);
 
	//升序排序
	sort(v.begin(), v.end());
	for_each(v.begin(), v.end(), print_vector);
	cout << endl;
 
	//降序排序
	sort(v.begin(), v.end(), greater<int>());
	for_each(v.begin(), v.end(), print_vector);
	cout << endl;
}

random_shuffle

洗牌,指定范围内的元素随机调整次序

  • random_shuffle(iterator beg, iterator end);
  • beg开始迭代器
  • end结束迭代器
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
        srand((unsigned int)time(NULL));
	vector<int>v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
 
	random_shuffle(v.begin(), v.end());
	for_each(v.begin(), v.end(), print_vector);
	cout << endl; //1 2 6 4 9 8 5 3 0 7
}

merge

容器元素合并,并存储到另一个容器中。两个容器必须是有序的。

  • merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
  • beg1容器1开始迭代器
  • end1容器1结束迭代器
  • beg2容器2开始迭代器
  • end2容器2结束迭代器
  • dest目标容器开始迭代器
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v1;
	vector<int>v2;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i + 1);
	}
 
	vector<int>v_target;
 
	//提前给目标容器开辟空间
	v_target.resize(v1.size() + v2.size());
 
	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v_target.begin());
 
	for_each(v_target.begin(), v_target.end(), print_vector);
	cout << endl;
}

reverse

反转指定范围的元素,前后对调。

  • reverse(iterator beg, iterator end);
  • beg开始迭代器
  • end结束迭代器
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
 
	cout << "反转前" << endl;
	for_each(v.begin(), v.end(), print_vector);
	cout << endl; //0 1 2 3 4 5 6 7 8 9
 
	reverse(v.begin(), v.end());
	cout << "反转后" << endl;
	for_each(v.begin(), v.end(), print_vector);
	cout << endl; //9 8 7 6 5 4 3 2 1 0
}

拷贝和替换算法

copy

容器内指定范围的元素拷贝到另一个容器中

  • copy(iterator beg, iterator end, iterator dest);
  • beg开始迭代器
  • end结束迭代器
  • dest目标容器开始迭代器
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
 
	vector<int>v_target;
	v_target.resize(v.size());
	copy(v.begin(), v.end(), v_target.begin());
	for_each(v_target.begin(), v_target.end(), print_vector);
	cout << endl;
}

replace

将容器内指定范围的旧元素修改为新元素

  • replace(iterator beg, iterator end, oldvalue, newvalue);
  • beg开始迭代器
  • end结束迭代器
  • oldvalue旧元素
  • newvalue新元素
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(10);
	v.push_back(30);
	v.push_back(40);
	v.push_back(30);
	//10 20 10 30 40 30 
 
	replace(v.begin(), v.end(), 10, 500);
	for_each(v.begin(), v.end(), print_vector);
	cout << endl; //50 20 50 30 40 30
}

replace_if

容器内指定范围满足条件的元素替换为新元素

  • replace_if(iterator beg, iterator end, _Pred, newvalue);
  • beg开始迭代器
  • end结束迭代器
  • _Pred谓词
  • newvalue新元素
class greater_20
{
public:
	int operator()(int val)
	{
		return val > 20;
	}
};
 
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(10);
	v.push_back(30);
	v.push_back(40);
	v.push_back(30);
	//10 20 10 30 40 30 
 
	//替换大于20的元素为100
	replace_if(v.begin(), v.end(), greater_20(), 100);
	for_each(v.begin(), v.end(), print_vector);
	cout << endl; //10 20 10 100 100 100
}

swap

互换两个容器元素

  • swap(container c1, container c2);
  • c1容器1
  • c2容器2
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v1;
	vector<int>v2;
	
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i + 10);
	}
	//v1 0 1 2 3 4 5 6 7 8 9
	//v2 10 11 12 13 14 15 16 17 18 19
	swap(v1, v2);
 
	for_each(v1.begin(), v1.end(), print_vector);
	cout << endl; //10 11 12 13 14 15 16 17 18 19
 
	for_each(v2.begin(), v2.end(), print_vector);
	cout << endl; //0 1 2 3 4 5 6 7 8 9
}

算数生成算法

添加头文件<numeric>

accumulate

计算区间内容器元素累计总和

  • accumulate(iterator beg, iterator end, value);
  • beg开始迭代器
  • end结束迭代器
  • value起始值
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v;
	for (int i = 0; i <= 10; i++) {
		v.push_back(i);
	}
 
	int total = accumulate(v.begin(), v.end(), 0);
	cout << "total = " << total << endl; //55
}

fill

向容器中添加元素

  • fill(iterator beg, iterator end, value);
  • beg开始迭代器
  • end结束迭代器
  • value填充的值
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v;
	v.resize(10);
 
	fill(v.begin(), v.end(), 100);
	for_each(v.begin(), v.end(), print_vector);
	cout << endl; //100 100 100 100 100 100 100 100 100 100
}

集合算法

set_intersection

求两个容器的交集。两个集合必须是有序序列。返回目标容器最后一个元素的迭代器地址。目标容器开辟空间需要从两个容器中取最小值。

  • set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
  • beg1容器1开始迭代器
  • end1容器1结束迭代器
  • beg2容器2开始迭代器
  • end2容器2结束迭代器
  • dest目标容器开始迭代器
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v1;
	vector<int>v2;
 
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i + 5);
	}
 
	vector<int>v_target;
	//最特殊的情况 大容器包含小容器 开辟的空间大小取小容器的size即可
	v_target.resize(min(v1.size(), v2.size()));
 
	//返回目标容器最后一个元素的迭代器地址
	vector<int>::iterator it_end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v_target.begin());
	
	//for_each(v_target.begin(), v_target.end(), print_vector);//5 6 7 8 9 0 0 0 0 0
	for_each(v_target.begin(), it_end, print_vector);//5 6 7 8 9
	cout << endl; 
}

set_union

求两个容器的并集。两个集合必须是有序序列。返回目标容器最后一个元素的迭代器地址。目标容器开辟空间需要两个容器相加。

  • set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
  • beg1容器1开始迭代器
  • end1容器1结束迭代器
  • beg2容器2开始迭代器
  • end2容器2结束迭代器
  • dest目标容器开始迭代器
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v1;
	vector<int>v2;
 
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i + 5);
	}
 
	vector<int>v_target;
	//最特殊的情况 两个容器没有交集 开辟的空间大小为两个容器size相加
	v_target.resize(v1.size() + v2.size());
 
	//返回目标容器最后一个元素的迭代器地址
	vector<int>::iterator it_end = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v_target.begin());
	
	for_each(v_target.begin(), it_end, print_vector);//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
	cout << endl; 
}

set_difference

求两个容器的差集。两个集合必须是有序序列。返回目标容器最后一个元素的迭代器地址。目标容器开辟空间需要两个容器取最大值。

  • set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
  • beg1容器1开始迭代器
  • end1容器1结束迭代器
  • beg2容器2开始迭代器
  • end2容器2结束迭代器
  • dest目标容器开始迭代器
void print_vector(int val)
{
	cout << val << " ";
}
 
void test()
{
	vector<int>v1;
	vector<int>v2;
 
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i + 5);
	}
 
	vector<int>v_target;
	//最特殊的情况 两个容器没有交集 开辟的空间大小为两个容器大的size
	v_target.resize(max(v1.size(), v2.size()));
 
	cout << "v1和v2的差集为:" << endl;
	vector<int>::iterator it_end_1 = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v_target.begin());
	for_each(v_target.begin(), it_end_1, print_vector);//0 1 2 3 4 
	cout << endl; 
 
	cout << "v2和v1的差集为:" << endl;
	vector<int>::iterator it_end_2 = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v_target.begin());
	for_each(v_target.begin(), it_end_2, print_vector);//10 11 12 13 14
	cout << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶油芝士汉堡包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值