【STL——常用遍历与查找算法】
引入
算法主要由头文件< algorithm>、< functional>、< numeric>组成。
- 是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等。
- 体积很小,只包括几个再序列上面进行简单数学运算的模板函数。
- 定义了一些模板类,用以声明函数对象。
常用遍历算法
for_each //遍历容器
transform //搬运容器到另一个容器中
注意:之前的方法都是通过对象引出来的,而现在这些都是直接调用的,不需要像m.insert()这样引出来。
for_each
for_each(iterator beg, iterator end, _func);
括号内容包括:遍历的开始迭代器、结束迭代器、函数或函数对象(对迭代器范围内每个元素的操作逻辑),范围依旧是[begin,end)。
- 头文件
#pragma once
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//普通函数
void print01(int val);//仿函数
class print02 {
public:void operator()(int val);
};void test();
- 源文件
#include"myFunc.h"void print01(int val) {cout << val<<" ";
}
//重载了圆括号运算符,使得print02类的对象可以像函数一样被调用
void print02::operator()(int val) {cout << val << " " ;
}void test() { vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}cout << "原函数:" << endl;for_each(v.begin(), v.end(), print01);cout << endl;cout << "仿函数:" << endl;for_each(v.begin(), v.end(), print02());
}
transform
功能描述:搬运容器到另一个容器中。
transform(iterator beg1, iterator end1, iterator beg2, _func);
将源容器从beg1到end1的内容搬到beg2中,并对每个范围内的对象进行_func操作。
- 定义类
class Transform {
public:int operator()(int val) {return val + 100;}
};class Myprint{
public:void operator()(int val) {cout << val << " ";}
};
- 功能实现
void test() { vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}vector<int> target;target.resize(v.size()); //目标容器需要提前开辟空间transform(v.begin(), v.end(), target.begin(),Transform());for_each(target.begin(), target.end(), Myprint());
}
常用查找算法

find
功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
函数原型:
find(iterator beg, iterator end, value);
查找[beg,end)位置上是否出现了value,若出现就返回出现位置的迭代器,未出现就返回结束迭代器end()。
void test() { vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}vector<int> ::iterator it=find(v.begin(),v.end(),6);if (it == v.end()) {cout << "未找到" << endl;}else cout << "找到了" << *it << endl;
}
find_if
功能描述:按条件查找元素
函数原型:
find_if(iterator beg, iterator end, _Pred);
_Pred返回bool类型的仿函数,条件就是_Pred里面的返回标准。
- 定义类
class GreaterFive {
public:bool operator()(int val) {return val == 5;}
};
- 功能实现
void test() { vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}vector<int> ::iterator it=find_if(v.begin(),v.end(),GreaterFive());if (it == v.end()) {cout << "未找到" << endl;}else cout << "找到了" << *it << endl;
}
adjacent_find
功能描述:查找相邻重复元素
函数原型:
adjacent_find(iterator beg, iterator end);
查找相邻重复元素,返回相邻元素的第一个位置的迭代器。
void test() { vector<int> v = {0,2,2,4,6,6,8};vector<int> ::iterator pos = adjacent_find(v.begin(), v.end());if (pos == v.end()) {cout << "未找到" << endl;}else cout << "找到了" << *pos << endl; //输出第一组重复元素的首个元素
}
binary_search
二分查找功能描述:查找指定元素是否存在(必须是有序数列)
函数原型:
bool binary_search(iterator beg, iterator end, value);
- 功能实现
void test() { vector <int>v;for (int i = 0; i < 10; i++) {v.push_back(i);}
bool ret= binary_search(v.begin(), v.end(), 6);
if (!ret) {cout << "未找到" << endl;
}
else cout << "找到了";
}
cout
功能描述:统计元素个数
函数原型:
count(iterator beg,iterator end, value);
void test() {vector <int>v = { 1,6,7,4,6,9,7,8 };int num = count(v.begin(), v.end(), 6);cout << "6的个数为:" << num;
}
count_if
功能描述:按条件统计元素个数
函数原型:
count_if(iterator beg, iterator end, _Pred);
_Pred内部的语句就作为判断的条件。
void test() {vector <int>v = { 9,12,31,44,89,1,5 };int num = count_if(v.begin(), v.end(), Greater10());cout << "大于10的数的个数为:" << num;
}
