C++_容器常用算法_学习笔记

常用头文件:

#include<algorithm>
#include<numeric>
#include<functional>

1 遍历

1.1 for_each遍历容器

for_each(iterator begin, iterator end, _func);

实现遍历输出。分别通过普通函数和仿函数来做。

void print01(int val)//普通函数方法
{
	endl << val << endl;
}
class print02 // 仿函数方法
{
public:
	void operator()(int val)
	{
		cout << val << endl;
	}
}
int main()
{
	for_each(v.begin(), v.end(), print01); // 普通函数放函数名即可
	for_each(v.begin(), v.end(), print02());// 函数对象要加括号
}

1.2 tranform搬运容器

搬运容器到另一个容器里面

transform(iterator begin1, iterator end1, iterator begin2, _func);

transform操作如果建立了新的空容器,要记得开辟空间。
可以在仿函数Trans中自定义一些另外的运算,增加搬运操作的灵活性。

void myprint(int val)
{
	cout << val << endl;
}
class Trans
{
public:
	int operator()(int val)
	{
		return val;
	}
};

void test()
{
	vector<int>v;  
	//假设v里面有东西了,赋值过程省略
	vector<int>new_v;
	new_v.resize(v.size());//一定要记得resize,不然放不下
	transform(v.begin(), v.end(), new_v.begin(), Trans());
	for_each(new_v.begin(), new_v.end(), myprint);
}

2 查找

2.1 find查找、find_if条件查找

返回指定元素的迭代器,或end()
查找自定义类型时,记得重载==

find(iterator begin, iterator end, value)
find_if(iterator begin, iterator end, _Pred)

以下举例说明条件查找自定义数据类型:

class Person
{
public:
	int m_age;
	string m_name;
	Person(string name, int age)
	{
		this -> m_name = name;
		this -> m_age = age;
	}
};
class Smaller30
{
public:
	bool operator()(Person& p) const
	{
		return p.m_age < 30;
	}
};

void test()
{
	vector<Person>v;
	Person p1("卢本伟", 25);
	Person p2("孙笑川", 35);
	Person p3("杀马特团长", 22);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	vector<Person>::iterator it = find_if(v.begin(), v.end(), Smaller30());
	if (it == v.end())
	{
		cout << "没有" << endl;
	}
	else {
		cout << "找到了:" << it->m_name << it -> m_age << endl;
	}
}

但find_if只能返回第一个找到的迭代器

2.2 adjacent_find 查找相邻重复元素

返回bool,而不是迭代器

adjacent_find(iterator begin, iterator end);

如果有相邻重复元素,则返回第一个的迭代器,否则返回end()迭代器

2.3 binary_search 二分查找

返回bool

binary_search(iterator begin, iterator end, value);

必须升序,否则不能使用

2.4 cout 统计元素个数、cout_if条件统计

返回int个数

binary_search(iterator begin, iterator end, value);
binary_search(iterator begin, iterator end, _Pred);

以下对自定义类型统计进行举例:

class Person
{
public:
	int m_age;
	string m_name;
	Person(string name, int age)
	{
		this -> m_name = name;
		this -> m_age = age;
	}
	//重载==
	bool operator==(const Person& p)
	{
		return this->m_age == p.m_age;
	}
};


void test()
{
	vector<Person>v;
	Person p1("卢本伟", 25);
	Person p2("孙笑川", 35);
	Person p3("杀马特团长", 35);

	Person p0("范小勤", 35);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	
	int num = count(v.begin(), v.end(), p0);//本质上是用==查找,如果不重载==会报错
	cout << "和范小勤同岁的人个数为:" << num;
}

3 排序

3.1 sort 升序排序

sort(iterator beg, iterator end, _Pred); 最后一个参数选填
sort(v.begin(), v.end()); // 默认升序
sort(v.begin(), v.end(),greater<int>()); // 使用内建函数降序排序

3.2 random_shuffle 打乱

random_shuffle(iterator begin, iterator end);

输入区间让他打乱就好了。记得加一个随机种子

srand((unsigned int)time(NULL));
random_shuffle(v.begin, v.end());

3.3 merge 合并容器,并存储在另一个容器中

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

注意:两个容器必须是有序的,合并之后的容器还是有序的
记得开辟空间

// 假设已经有两个有序容器v1, v2
vector<int>vTarget;
vTarget.resize(v1.size()+v2.size());
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

3.4 reverse 逆序

reverse(iterator begin, iterator end);

4 拷贝和替换

4.1 copy 拷贝范围内元素

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

4.2 replace 替换范围内、replace_if 条件替换

replace(iterator beg, iterator end, old_value, new_value);
把范围内所有的old_value替换为new_value
replace_if(iterator beg, iterator end, _pred, new_value);
将范围内所有满足条件的数替换为new_value

4.3 swap 互换两个容器

swap(container c1, container c2);

一定要同种类型的容器

5 算数生成

需要包含头文件#include <numeric.h>

5.1 accumulate 区间内元素求和

accumulate(iterator beg, iterator end, value)

value是起始累加值,不需要的话写0

5.2 fill 快速填充区间

一般用于后期填充

fill(iterator beg, iterator end, value)

在区间内填满value

6 集合

6.1 set_itersection 获取交集

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

iterator dest是结果存放的目标迭代器
两个集合必须有序

6.2 set_union 获取并集

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

两个集合必须有序

6.3 set_difference 获取差集(交集的补集)

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

两个集合必须有序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值