常用遍历算法
头文件:<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 //差集