常用算法
算法主要是由头文件<algorithm><functional><numeric>
组成。
<algorithm>
是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等。
<numeric>
体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
<functional>
定义了一些模板类用以声明函数对象。
常用遍历算法
1、for_each
遍历容器
2、transform
搬运容器到另一个容器中
for_each
for_each(iterator beg,interator end,_func);
遍历算法,遍历容器元素,beg开始迭代器,end结束迭代器,_func函数或者函数对象
//普通函数
void p1(int val) {
cout << val << " ";
}
//仿函数
class p2 {
public:
void operator()(int val) {
cout << val << " ";
}
};
void test() {
...
//普通函数
for_each(v.begin(), v.end(),p1);
cout << endl;
cout << "-----------------------------------------" << endl;
//仿函数
for_each(v.begin(), v.end(), p2());
}
transform
transform(iterator beg1,interator end1,interator beg2,_func);
beg1源容器开始迭代器,end源容器结束迭代器,beg2目标容器开始迭代器,_func函数或者函数对象
//输出仿函数
class p1 {
public:
void operator()(int val) {
cout << val << " ";
}
};
//加100仿函数
class p2 {
public:
int operator()(int val) {
return val+100;
}
};
void test() {
vector<int> v;
v.push_back(12);
v.push_back(32);
v.push_back(57);
v.push_back(22);
v.push_back(65);
vector<int>v1;
v1.resize(v.size());//目标容器必须提前开辟空间
transform(v.begin(), v.end(), v1.begin(),p2());
for_each(v1.begin(), v1.end(), p1());
}
常用查找算法
1、find
查找元素
2、find_if
按条件查找元素
3、adjacent_find
查找相邻重复元素
4、binary_search
二分查找法
5、count
统计元素个数
6、count_if
按条件统计元素个数
find
查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
find(iterator beg,interator end,value);
按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置,beg开始迭代器,end结束迭代器,value查找的元素
void test() {
//内置数据类型
vector<int> v;
v.push_back(12);
v.push_back(32);
v.push_back(57);
v.push_back(22);
v.push_back(65);
vector<int>::iterator ret = find(v.begin(), v.end(), 32);
if (ret != v.end()) {
cout << "找到" << endl;
}
else {
cout << "没有找到" << endl;
}
//自定义类型
vector<S> v1;
S s1("Tom", 13);
S s2("Ala", 32);
S s3("Tony", 15);
S s4("Mary", 18);
S s5("Mola", 23);
v1.push_back(s1);
v1.push_back(s2);
v1.push_back(s3);
v1.push_back(s4);
vector<S>::iterator ret1 = find(v1.begin(), v1.end(), s5);
if (ret1 != v1.end()) {
cout << "找到" << endl;
}
else {
cout << "没有找到" << endl;
}
}
find_if
find_if(iterator beg,interator end,_Pred);
按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置,beg开始迭代器,end结束迭代器,_Pred函数或者谓词(返回bool类型的仿函数)
void test() {
//内置数据类型
...
vector<int>::iterator ret = find_if(v.begin(), v.end(), p1());
if (ret != v.end()) {
cout << "找到" << endl;
}
else {
cout << "没有找到" << endl;
}
...
vector<S>::iterator ret1 = find_if(v1.begin(), v1.end(), p2());
if (ret1 != v1.end()) {
cout << "找到" << endl;
}
else {
cout << "没有找到" << endl;
}
}
adjacent_find
查找相邻重复元素
adjacent_find(iterator beg,interator end);
查找相邻重复元素,返回相邻元素的第一个位置的迭代器,beg开始迭代器,end结束迭代器
void test() {
//内置数据类型
vector<int> v;
v.push_back(12);
v.push_back(32);
v.push_back(12);
v.push_back(22);
v.push_back(65);
vector<int>::iterator ret = adjacent_find(v.begin(), v.end());
if (ret != v.end()) {
cout << "找到相邻的元素:"<<*ret << endl;
}
else {
cout << "没有找到相邻的元素" << endl;
}
binary_search
二分查找法,查找指定的元素,查到返回true,否则false
binary_search(iterator beg,interator end,value);
在无序序列中不可用,beg开始迭代器,end结束迭代器,value查找的元素
count
统计元素个数
count(iterator beg,interator end,value);
统计元素出现次数,beg开始迭代器,end结束迭代器,value统计的元素
void test() {
//内置数据类型
vector<int> v;
...
v.push_back(50);
...
v.push_back(50);
v.push_back(50);
int ret = count(v.begin(), v.end(),1);
cout <<"1的个数:" << ret << endl;
vector<S> v1;
...
S s4("Mary", 18);
S s5("Mola", 18);
...
int ret1 = count(v1.begin(), v1.end(), s5);
cout << "年龄为18的个数:" << ret1 << endl;
count_if
按条件统计元素个数
count_if(iterator beg,interator end,_Pred);
按条件统计元素出现次数,beg开始迭代器,end结束迭代器,_Pred谓词
//内置数据类型
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(50);
v.push_back(30);
v.push_back(40);
v.push_back(50);
v.push_back(50);
int ret = count_if(v.begin(), v.end(),p1());
cout <<"大于等于40的个数:" << ret << endl;
vector<S> v1;
S s1("Tom", 13);
S s2("Ala", 32);
S s3("Tony", 15);
S s4("Mary", 18);
S s5("Mola", 18);
v1.push_back(s1);
v1.push_back(s2);
v1.push_back(s3);
v1.push_back(s4);
v1.push_back(s5);
int ret1 = count_if(v1.begin(), v1.end(), p2());
cout << "年龄大于等于18的个数:" << ret1 << endl;