【C++中的STL】常用算法1——遍历算法和查找算法
常用算法1
- 常用算法
- 常用遍历算法
- for_each
- transform
- 常用查找算法
- find
- find_if
- adjacent_find
- binary_search
- count
- count_if
常用算法
算法主要是由头文件<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;