【C++中的STL】常用算法1——遍历算法和查找算法

常用算法1

  • 常用算法
    • 常用遍历算法
      • for_each
      • transform
    • 常用查找算法
      • find
      • find_if
      • adjacent_find
      • binary_search
      • count
      • count_if

常用算法

算法主要是由头文件组成。
是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等。
体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
定义了一些模板类用以声明函数对象。

常用遍历算法

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());
}

【C++中的STL】常用算法1——遍历算法和查找算法_第1张图片

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());
}

【C++中的STL】常用算法1——遍历算法和查找算法_第2张图片

常用查找算法

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;

【C++中的STL】常用算法1——遍历算法和查找算法_第3张图片

你可能感兴趣的:(C++,c++,算法,开发语言)