概述:
- 算法主要是由头文件<algorithm><functional><numeric>组成
- <algorithm>是所有stl头文件中最大的一个,涉及比较,交换,查找,遍历,复制,修改等操作
- <numeric>体积很小,只包括几个在序列上进行简单数学运算的模板函数
- <functional>定义了一些类模板,用以声明函数对象
一、常用遍历算法
- for_each 遍历容器
- transform 搬运容器到另一个容器中
1、for_each
函数原型:
for_each(iterator beg,iterator end,_func);
遍历算法,遍历容器元素
beg开始迭代器
end结束迭代器
_func函数或者函数对象
//普通函数
void print1(int val)
{
cout << val << " ";
}
//仿函数
class print2
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v;
v.push_back(2);
v.push_back(6);
v.push_back(15);
v.push_back(8);
v.push_back(26);
v.push_back(56);
v.push_back(16);
v.push_back(33);
v.push_back(21);
for_each((), (), print1);//普通函数遍历
cout << endl;
for_each((), (), print2());//仿函数遍历
}
int main()
{
test01();
system("pause");
return 0;
}
2、transform
功能:搬运容器到另一个容器中
函数原型:
transform(iterator beg1,iterator end1,iterator beg2,_func);
beg1 源容器开始迭代器
end1 源容器结束迭代器
beg2 目标容器开始迭代器
_func 函数或函数对象
//搬运过程可以做一些逻辑运算
class transform1
{
public:
int operator()(int val)
{
return val;
}
};
void test01()
{
vector<int> v;
v.push_back(2);
v.push_back(6);
v.push_back(15);
v.push_back(8);
v.push_back(26);
v.push_back(56);
v.push_back(16);
v.push_back(33);
v.push_back(21);
vector<int> v1;
(());//搬运前给目标容器分配内存
transform((), (), (), transform1());
for_each((), (), print1);
}
int main()
{
test01();
system("pause");
return 0;
}
二、常用查找算法
算法简介:
- find 查找元素
- find_if 按条件查找元素
- adjacent_find 查找相邻重复元素
- binary_search 二分法查找
- count 统计元素个数
- count_if 按条件统计元素个数
1、find
功能描述:查找指定元素,找到返回元素的迭代器,找不到返回结束迭代器end()
函数原型:
find(iterator beg,iterator end,value);
按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
beg开始迭代器
end结束迭代器
value查找的元素
//查找内置数据类型
void test01()
{
vector<int> v;
v.push_back(2);
v.push_back(6);
v.push_back(15);
v.push_back(8);
v.push_back(26);
v.push_back(56);
v.push_back(16);
v.push_back(33);
v.push_back(21);
vector<int>::iterator it = find((), (), 6);
if (it == ())
{
cout << "没有找到" << endl;
}
else {
cout << "找到了" << *it << endl;
}
}
class person
{
public:
string m_name;
int m_age;
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;
}
}
};
void test02()
{
vector<person> v1;
person p1("aaa", 20);
person p2("bbb", 30);
v1.push_back(p1);
v1.push_back(p2);
vector<person>::iterator it = find((), (), p2);
if (it == ())
{
cout << "no" << endl;
}
else {
cout << "yes " << it->m_name << " " << (*it).m_age << endl;
}
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
2、find_if
函数原型:
find_if(iterator beg,iterator end,pred_);
按值查找元素,找到返回指定位置迭代器,找不到返回end迭代器
beg开始迭代器
end结束迭代器
pred_ 函数或者谓词
class greatfive
{
public:
int operator()(int val)
{
return val > 5;
}
};
//查找内置数据类型
void test01()
{
vector<int> v;
v.push_back(2);
v.push_back(6);
v.push_back(15);
v.push_back(8);
v.push_back(26);
v.push_back(56);
v.push_back(16);
v.push_back(33);
v.push_back(21);
vector<int>::iterator it = find_if((), (), greatfive());
if (it == ())
{
cout << "没有找到" << endl;
}
else {
cout << "找到了" << *it << endl;
}
}
class person
{
public:
string m_name;
int m_age;
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;
}
}
};
class great20
{
public:
bool operator()(person &p)
{
return p.m_age > 20;
}
};
void test02()
{
vector<person> v1;
person p1("aaa", 20);
person p2("bbb", 30);
v1.push_back(p1);
v1.push_back(p2);
vector<person>::iterator it = find_if((), (), great20());
if (it == ())
{
cout << "no" << endl;
}
else {
cout << "yes " << it->m_name << " " << (*it).m_age << endl;
}
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
3、adjacent_find
查找相邻重复元素
函数原型:
adjacent_find(iterator beg,iterator end)
查找相邻重复元素,返回相邻元素的第一个位置迭代器
beg开始迭代器
end结束迭代器
void test01()
{
vector<int> v;
v.push_back(2);
v.push_back(6);
v.push_back(15);
v.push_back(15);
v.push_back(26);
v.push_back(56);
v.push_back(16);
v.push_back(16);
v.push_back(56);
vector<int>::iterator it = adjacent_find((), ());
if (it == ())
{
cout << "没有找到" << endl;
}
else {
cout << "找到了" << *it << endl;
}
}
int main()
{
test01();
//test02();
system("pause");
return 0;
}
4、binary_search
查找指定元素是否存在
!!!容器中的元素必须是有序的序列
函数原型:
binary_find(iterator beg,iterator end,value)
查找指定的元素,找到返回true 找不到返回false
beg开始迭代器
end结束迭代器
value 指定的查找元素
void test01()
{
set<int> v;
(2);
(6);
(15);
(26);
(56);
(16);
bool it = binary_search((), (),10);
if (!it)
{
cout << "没有找到" << endl;
}
else {
cout << "找到了" << endl;
}
}
int main()
{
test01();
//test02();
system("pause");
return 0;
}
5、count
功能:统计元素个数
函数原型:
count(iterator beg,iterator end,value)
统计元素出现次数
beg开始迭代器
end结束迭代器
value 指定的统计元素
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
int num = count((), (),14);
cout << num << endl;
}
class person
{
public:
string m_name;
int m_age;
person(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
//重载==,让底层find知道如何对比person数据类型
bool operator==(const person&p)
{
if (this->m_age == p.m_age)
{
return true;
}
else
{
return false;
}
}
};
void test02()
{
vector<person> v1;
person p1("aaa", 20);
person p2("bbb", 30);
person p3("aaa", 20);
person p4("aaa", 20);
person p5("aaa", 60);
person p6("ccc", 50);
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
v1.push_back(p4);
v1.push_back(p5);
v1.push_back(p6);
person p("cc", 20);
int num = count((), (), p);
cout << num << endl;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
6、count_if
按条件统计元素个数
函数原型:
count_if(iterator beg,iterator end,pred_)
按照条件统计元素出现次数
beg开始迭代器
end结束迭代器
pred_ 谓词
class greatfive
{
public:
int operator()(int val)
{
return val > 20;
}
};
//查找内置数据类型
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
int num = count_if((), (),greatfive());
cout << num << endl;
}
class person
{
public:
string m_name;
int m_age;
person(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
//重载==,让底层find知道如何对比person数据类型
bool operator==(const person&p)
{
if (this->m_age == p.m_age)
{
return true;
}
else
{
return false;
}
}
};
class great20
{
public:
bool operator()(person &p)
{
return p.m_age > 20;
}
};
void test02()
{
vector<person> v1;
person p1("aaa", 20);
person p2("bbb", 30);
person p3("aaa", 20);
person p4("aaa", 20);
person p5("aaa", 60);
person p6("ccc", 50);
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
v1.push_back(p4);
v1.push_back(p5);
v1.push_back(p6);
int num = count_if((), (), great20());
cout << num << endl;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
7
3
请按任意键继续. . .
三、常用排序算法
算法简介:
- sort 对容器内元素进行排序
- random_shuffle 洗牌,指定范围内的元素随机调整次序
- merge 容器元素合并,并存储到另一个容器中
- reverse 反转指定范围内的元素
1、sort
函数原型:
sort(iterator beg,iterator end,pred_)
按照条件对元素进行排序
beg开始迭代器
end结束迭代器
pred_ 谓词
class compare1
{
public:
int operator()(int val1,int val2)
{
return val1 > val2;
}
};
//查找内置数据类型
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
sort((), ());
for_each((), (),print2());
cout << endl;
cout << "---------------------" << endl;
//降序排列
sort((), (),compare1());
for_each((), (), print2());
}
int main()
{
test01();
//test02();
system("pause");
return 0;
}
10 14 14 14 20 26 50 67 75 89 153 167
---------------------
167 153 89 75 67 50 26 20 14 14 14 10 请按任意键继续. . .
2、random_shuffle
功能:指定范围内元素随机调整次序
函数原型:
random_shuffle(iterator beg,iterator end)
指定范围内元素随机调整次序
beg开始迭代器
end结束迭代器
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
sort((), ());
for_each((), (),print2());
cout << endl;
cout << "---------------------" << endl;
random_shuffle((), ());
for_each((), (), print2());
}
int main()
{
srand((unsigned int)time(NULL));//随机数种子
test01();
//test02();
system("pause");
return 0;
}
10 14 14 14 20 26 50 67 75 89 153 167
---------------------
153 14 89 14 10 167 67 14 20 50 75 26 请按任意键继续. . .
3、merge
两个容器元素合并,并存储到另一个容器中
函数原型:
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
两个容器元素合并,并存储到另一个容器中
!!!注意:两个容器必须是有序的,并且顺序一致
beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
sort((), ());
for_each((), (),print2());
cout << endl;
cout << "---------------------" << endl;
vector<int> v2;
v2.push_back(10);
v2.push_back(30);
v2.push_back(150);
v2.push_back(23);
v2.push_back(67);
v2.push_back(153);
v2.push_back(157);
v2.push_back(123);
v2.push_back(562);
v2.push_back(1235);
v2.push_back(845);
v2.push_back(777);
sort((), ());
for_each((), (), print2());
cout << endl;
cout << "---------------------" << endl;
vector<int> v3;
(()+());
merge((), (), (), (), ());
for_each((), (), print2());
}
int main()
{
srand((unsigned int)time(NULL));
test01();
//test02();
system("pause");
return 0;
}
10 14 14 14 20 26 50 67 75 89 153 167
---------------------
10 23 30 67 123 150 153 157 562 777 845 1235
---------------------
10 10 14 14 14 20 23 26 30 50 67 67 75 89 123 150 153 153 157 167 562 777 845 1235 请按任意键继续. . .
4、reverse
将容器中元素进行反转
reverse(iterator beg,iterator end)
反转指定范围内元素
beg开始迭代器
end结束迭代器
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
sort((), ());
for_each((), (),print2());
cout << endl;
cout << "---------------------" << endl;
reverse((), ());
for_each((), (), print2());
}
int main()
{
srand((unsigned int)time(NULL));
test01();
//test02();
system("pause");
return 0;
}
10 14 14 14 20 26 50 67 75 89 153 167
---------------------
167 153 89 75 67 50 26 20 14 14 14 10 请按任意键继续. . .
四、常用拷贝和替换算法
算法简介:
- copy 容器内指定范围的元素拷贝到另一容器中
- replace 将容器内指定范围的旧元素修改为新元素
- replace_if 将容器内指定范围满足条件的元素修改为新元素
- swap 互换两个容器元素
1、copy
容器中指定范围的元素拷贝到另一个容器中
函数原型:
copy(iterator beg,iterator end,iterator dest);
beg开始迭代器
end结束迭代器
dest 目标起始迭代器
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
vector<int> v2;
(());
copy((), (), ());
for_each((), (), print2());
}
int main()
{
srand((unsigned int)time(NULL));
test01();
//test02();
system("pause");
return 0;
}
2、replace
将容器内指定范围的旧元素修改为新元素
函数原型:
replace(iterator beg,iterator end,oldvalue,newvalue)
将容器内指定范围的旧元素修改为新元素
beg开始迭代器
end结束迭代器
old value 旧元素
newvalue 新元素
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
for_each((), (), print2());
cout << endl;
replace((), (), 14,10000);
for_each((), (), print2());
}
int main()
{
//srand((unsigned int)time(NULL));
test01();
//test02();
system("pause");
return 0;
}
10 20 50 14 67 153 167 14 26 14 89 75
10 20 50 10000 67 153 167 10000 26 10000 89 75 请按任意键继续. . .
3、replace_if
功能:将区间内满足条件的元素,替换成指定元素
函数原型:
replace_if(iterator beg,iterator end,pred_,newvalue)
按照条件替换元素,满足条件的替换成指定元素
beg开始迭代器
end结束迭代器
pred_谓词 (条件)
newvalue替换的新元素
class greatfive
{
public:
int operator()(int val)
{
return val > 20;
}
};
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
for_each((), (), print2());
cout << endl;
replace_if((), (), greatfive(),10000);
for_each((), (), print2());
}
int main()
{
//srand((unsigned int)time(NULL));
test01();
//test02();
system("pause");
return 0;
}
10 20 50 14 67 153 167 14 26 14 89 75
10 20 10000 14 10000 10000 10000 14 10000 14 10000 10000 请按任意键继续. . .
4、swap
功能:互换两个容器的元素
函数原型:
swap(container c1,container c2)
互换两个同种容器的元素
c1 容器1
c2 容器2
class print2
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
for_each((), (), print2());
cout << endl;
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(50);
v1.push_back(14);
v1.push_back(67);
v1.push_back(153);
for_each((), (), print2());
cout << endl;
swap(v, v1);
for_each((), (), print2());
cout << endl;
for_each((), (), print2());
}
int main()
{
//srand((unsigned int)time(NULL));
test01();
//test02();
system("pause");
return 0;
}
10 20 50 14 67 153 167 14 26 14 89 75
10 20 50 14 67 153
10 20 50 14 67 153
10 20 50 14 67 153 167 14 26 14 89 75 请按任意键继续. . .
五、常用算术生成算法
算术生成算法属于小型算法,使用时包含头文件为#include<numeric>
算法简介:
accumulate 计算容器内元素累计总和
fill 向容器内添加元素
1、accumulate
功能:计算容器内元素累计总和
函数原型:
accumulate(iterator beg,iterator end,value)
beg 开始迭代器
end 结束迭代器
value 起始值
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
int sum = accumulate((), (), 0);
cout << sum << endl;
}
2、fill
函数原型:
fill(iterator beg,iterator end,value)
向容器中填充元素
beg 开始迭代器
end 结束迭代器
value 填充的值
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
for_each((), (), print2());
cout << endl;
fill((), (), 2);
for_each((), (), print2());
}
10 20 50 14 67 153 167 14 26 14 89 75
2 2 2 2 2 2 2 2 2 2 2 2 请按任意键继续. . .
六、常用集合算法
算法简介:
- set_intersection 求两个容器交集
- set_union 求两个容器并集
- set_difference 求两个容器差集
1、set_intersection
函数原型:
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator beg3)
求两个集合的交集,返回目标容器的最后一个元素迭代器,两个集合必须是有序的
beg1,容器1开始迭代器
end1,容器1结束迭代器
beg2,容器2开始迭代器
end2,容器2结束迭代器
beg3,交集容器3开始迭代器
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
sort((), ());
for_each((), (), print2());
cout << endl;
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(50);
v1.push_back(14);
v1.push_back(67);
v1.push_back(153);
v1.push_back(167);
v1.push_back(15);
v1.push_back(17);
v1.push_back(100);
v1.push_back(101);
v1.push_back(102);
sort((), ());
for_each((), (), print2());
cout << endl;
vector<int> v2;
(min((),()));
vector<int>::iterator it = set_intersection((), (), (), (), ());
for_each((), it, print2());
}
10 14 14 14 20 26 50 67 75 89 153 167
10 14 15 17 20 50 67 100 101 102 153 167
10 14 20 50 67 153 167 请按任意键继续. . .
2、set_union
函数原型:
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator beg3)
求两个集合的并集,返回目标容器最后一个元素迭代器,两个集合必须是有序序列
beg1,容器1开始迭代器
end1,容器1结束迭代器
beg2,容器2开始迭代器
end2,容器2结束迭代器
beg3,交集容器3开始迭代器
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
sort((), ());
for_each((), (), print2());
cout << endl;
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(50);
v1.push_back(14);
v1.push_back(67);
v1.push_back(153);
v1.push_back(167);
v1.push_back(15);
v1.push_back(17);
v1.push_back(100);
v1.push_back(101);
v1.push_back(102);
sort((), ());
for_each((), (), print2());
cout << endl;
vector<int> v2;
(()+());
vector<int>::iterator it = set_union((), (), (), (), ());
for_each((), it, print2());
}
10 14 14 14 20 26 50 67 75 89 153 167
10 14 15 17 20 50 67 100 101 102 153 167
10 14 14 14 15 17 20 26 50 67 75 89 100 101 102 153 167 请按任意键继续. . .
3、set_difference
函数原型:
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator beg3)
求两个集合的差集,返回目标容器最后一个元素迭代器,两个集合必须是有序序列
beg1,容器1开始迭代器
end1,容器1结束迭代器
beg2,容器2开始迭代器
end2,容器2结束迭代器
beg3,交集容器3开始迭代器
void test01()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(14);
v.push_back(67);
v.push_back(153);
v.push_back(167);
v.push_back(14);
v.push_back(26);
v.push_back(14);
v.push_back(89);
v.push_back(75);
sort((), ());
for_each((), (), print2());
cout << endl;
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(50);
v1.push_back(14);
v1.push_back(67);
v1.push_back(153);
v1.push_back(167);
v1.push_back(15);
v1.push_back(17);
v1.push_back(100);
v1.push_back(101);
v1.push_back(102);
sort((), ());
for_each((), (), print2());
cout << endl;
vector<int> v2;
(()+());
vector<int>::iterator it = set_difference((), (), (), (), ());
for_each((), it, print2());
}
10 14 14 14 20 26 50 67 75 89 153 167
10 14 15 17 20 50 67 100 101 102 153 167
14 14 26 75 89 请按任意键继续. . .