STL常用算法总结

常用遍历算法

头文件:<algorithm> <functional> <numeric>

<algorithm>是所有STL文件中最大的一个,范围涉及比较、交换、查找、遍历操作、复制、修改等等

<functional>体积很小,只包含几个在序列上面进行简单数学运算的模板函数

<numeric>定义了一些模板类,用以声明函数对象


  • 常用遍历算法

1. for_each//遍历容器

2. transform //搬运容器到另一个容器中

  • 常用查找算法

1. find //查找元素,如果是自定义数据类型,需要重载运算符

2. find_if //按条件查找元素

3. adjacent_find //查找相邻元素,返回相邻元素的第一个位置的迭代器

4. binary_search //二分查找法,无序序列中不可用

void test01()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}

	bool ret = binary_search(v.begin(), v.end(), 9);
	if (ret)
	{
		cout << "找到了" << endl;
	}
}

5. count //统计元素个数

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

	bool operator==(const Person& p)
	{
		if (this->m_Age == p.m_Age)
			return true;
		else
			return false;
	}

	string m_Name;
	int m_Age;
};

void test01()
{
	//内置数据类型

	/*vector<int> v;
	v.push_back(10);
	v.push_back(40);
	v.push_back(40);
	v.push_back(60);
	v.push_back(70);
	v.push_back(40);

	int num = count(v.begin(), v.end(), 40);
	cout << num << endl;*/

	//自定义数据类型

	vector<Person> v;
	Person p1("刘备", 35);
	Person p2("曹操", 45);
	Person p3("孙权", 40);
	Person p4("赵云", 26);
	Person p5("张飞", 35);
	Person p6("关羽", 35);

	Person p("诸葛亮", 35);

	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);
	v.push_back(p6);

	int num = count(v.begin(), v.end(), p);

	cout << num << endl;

}

6. count_if //按条件统计元素个数

统计内置数据类型
class Greater20
{
Public:
	bool operator()(int val)
	{
		return val > 20;
	}
}
  • 常用排序算法

1. sort //对容器内元素进行排序

2. random_shuffle //洗牌 指定范围内的元素随机调整次序

void myPrint(int val)
{
	cout << val << endl;
}

void test01()
{
	srand((unsigned int)time(NULL));
	//内置数据类型

	vector<int> v;
	v.push_back(10);
	v.push_back(40);
	v.push_back(40);
	v.push_back(60);
	v.push_back(70);
	v.push_back(40);

	random_shuffle(v.begin(), v.end());

	for_each(v.begin(), v.end(), myPrint);
}

3. merge //容器元素合并,并储存到另一容器中

void myPrint(int val)
{
	cout << val << endl;
}

void test01()
{
	//内置数据类型

	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	v.push_back(60);

	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);

	vector<int> v2;
	//提前给目标容器分配空间
	v2.resize(v.size() + v1.size());//多余的空间0补齐

	merge(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());

	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;
}

使用时要注意顺序问题以及要提前给目标容器分配足够的空间

4. reverse //反转指定范围的元素

  • 常用拷贝和替换算法

1.copy

void test01()
{
	//内置数据类型

	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	v.push_back(60);

	for_each(v.begin(), v.end(), myPrint);
	cout << endl;

	vector<int> v2;
	v2.resize(v.size());
	copy(v.begin(), v.end(), v2.begin());

	for_each(v.begin(), v.end(), myPrint);//仿函数和普通函数都可以
	cout << endl;
}

2.replace

vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
v.push_back(60);

for_each(v.begin(), v.end(), myPrint);
cout << endl;

replace(v.begin(), v.end(), 20, 100);
for_each(v.begin(), v.end(), myPrint);
cout << endl;

3.replace_if

repalce_if(iterator beg, iterator end, _pred, newvalue)//_pred 谓词

4.swap

放入两个容器
  • 常用算术生成算法

包含的头文件为#include <numeric>

1.accumulate // 计算容器元素累积总和

accumulate(iteratoe beg, iterator end, value)//第三个参数是一个起始累加值,自定义数据类型类内重载“+”

2.fill //向容器中添加元素

vector<int> v;

v.resize(10);
//后期重新填充
fill(v.begin(), v.end(), 100);
  • 常用集合算法

1.set_intersection //两个容器的交集

目标容器需要提前开辟空间,取小容器空间即可
vTarget.resize(min(v1.size(), v2.size()))

vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2,begin(), v2.end(), vTarget.begin());//返回值是交集中最后一个元素的位置

2.set_union //并集

3.set_difference //差集

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值