常用头文件:
#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);
两个集合必须有序