C++STL之algorithm(一)

小编最近在努力学习C++进阶编程知识,趁着周末总结一下自己学习的STL算法部分的一些方法,和大家一起分享一下。

非修改性算法:

 一、for_each 算法 

原型: for_each(Iterator begin,Iterator end,Function fn)

功能:遍历容器中的元素

用法:

	vector <int> myvector,myvector2;
	fillValue(myvector);
	fillValue(myvector2);
	for_each(myvector.begin(), myvector.end(), printValue);
	cout << endl;

	for_each(myvector.begin(), myvector.end(), Multiple<int>(2));
	for_each(myvector.begin(), myvector.end(), printValue);
	cout << endl;

	double sum = for_each(myvector.begin(), myvector.end(), SUM());
	cout << sum << endl;

二、元素计数算法

原型: count(Iterator begin,Iterator end,const T& value)
          count(Iterator begin,Iterator end,UnaryPredicate op)

功能:统计容器中满足value和op的元素个数

用法:

	int ct = count(myvector.begin(), myvector.end(), 4);
	int ctif = count_if(myvector.begin(), myvector.end(), isEven);
	int ctg = count_if(myvector.begin(), myvector.end(), bind2nd(greater<int>(), 2));

三、最大值最小值

原型:Iterator min_element(Iterator beg , Iterator end)
     Iterator min_element(Iterator beg , Iterator end , compFunc op)
     Iterator max_element(Iterator beg , Iterator end)
     Iterator max_element(Iterator beg , Iterator end , compFunc op)

功能:寻找容器中的最大值和最小值,返回其地址。

用法:

	int minNum = *min_element(myvector2.begin(), myvector2.end());
	int maxNum = *max_element(myvector2.begin(), myvector2.end());

	int minAbsNum = *min_element(myvector2.begin(), myvector2.end(), absLess);
	int maxAbsNum = *max_element(myvector2.begin(), myvector2.end(), absLess);

四、搜寻元素

1. find / find_if

原型:Iterator find(Iterator begin , Iterator end , const T& value)
     Iterator fin_if(Iterator begin ,Iterator end , UnaryPredicate op)

功能:寻找容器中满足value和op的元素

P S : distance(InputIterator first,InputIterator last) 计算两个迭代器变量间的距离

用法:

	vector<int>::iterator pos_find_1, pos_find_if;

	pos_find_1 = find(myvector2.begin(), myvector2.end(), 5);

	// 返回第一个值大于3的位置

	pos_find_if = find_if(myvector2.begin(), myvector2.end(), bind2nd(greater<int>(),3));
	cout << "first value  = 5 pos :" << distance(myvector2.begin(),pos_find_1) + 1 << endl;
	cout << "first value  > 5 pos :" << distance(myvector2.begin(),pos_find_if) + 1 << endl;

2. search_n

原型:Iterator search_n (Iterator begin, Iterator end, Size count, const T& value)
     Iterator search_n (Iterator begin, Iterator end, Size count, const T& value,BinaryPredicate op)

功能:搜索前n个连续匹配的值

用法:

	vector<int>::iterator pos_search_n_1,pos_search_n_2;

	// 搜索vector 中连续两个值为2的起始位置
	pos_search_n_1= search_n(myvector2.begin(), myvector2.end(), 2, 2);

	// 搜索vector 中连续值大于2的起始位置
	pos_search_n_2 = search_n(myvector2.begin(), myvector2.end(),4,4,greater<int>());

	if (pos_search_n_1 != myvector2.end())
	{
		cout << "2个连续大于2的值的起始位置是: " << distance(myvector2.begin(), pos_search_n_1) + 1 << endl;
	}
	else
	{
		cout << "没有找到符合要求的元素" << endl;
	}

	if (pos_search_n_2 != myvector2.end())
	{
		cout << "4个连续大于4的值的起始位置是: " << distance(myvector2.begin(), pos_search_n_2) + 1 << endl;
	}
	else
	{
		cout << "没有找到符合要求的元素" << endl;
	}

3. search

原型:Iterator search (Iterator1 begin, Iterator1 end, Iterator2 searchBegin, Iterator2 searchEnd)

     Iterator search (Iterator1 begin, Iterator1 end,

            Iterator2 searchBegin, Iterator2 searchEnd, BinaryPredicate op)

功能:搜索第一个子区间

用法:

	vector<int> subVector;
	vector<int>::iterator pos_search_1,pos_search_2;

	setValue(subVector, -1, 3);
	pos_search_1 = search(myvector2.begin(), myvector2.end(), subVector.begin(), subVector.end());

	if (pos_search_1 != myvector2.end())
	{
		cout << "子串在原串的位置是(search):" << distance(myvector2.begin(), pos_search_1) + 1 << endl;
	}
	else
	{
		cout << "没有搜索到子串" << endl;
	}

	bool checkEvenArr[3] = { true, false, true };
	pos_search_2 = search(myvector2.begin(), myvector2.end(), checkEvenArr, checkEvenArr + 3, checkEven);

	if (pos_search_2 != myvector2.end())
	{
		cout << "子串在原串的位置是(search + op):" << distance(myvector2.begin(), pos_search_2) + 1 << endl;
	}
	else
	{
		cout << "没有搜索到子串" << endl;
	}

4. find_end 

原型:Iterator find_end(Iterator begin,Iterator end,Iterator2 searchBegin,Iterator2,searchEnd)
     Iterator find_end(Iterator begin,Iterator end,

             Iterator2 searchBegin,Iterator2,searchEnd,binaryPredicate op)

功能:搜索最后一个子区间

用法:

	vector<int>::iterator pos_find_end_1;
	pos_find_end_1 = find_end(myvector2.begin(), myvector2.end(), subVector.begin(), subVector.end());
	if (pos_find_end_1 != myvector2.end())
	{
		cout << "子串在原串的位置是(find_end):" << distance(myvector2.begin(), pos_find_end_1) + 1 << endl;
	}
	else
	{
		cout << "没有搜索到子串" << endl;
	}

5.find_first_of

原型:Iterator find_first_of(Iterator begin,Iterator end,Iterator2 searchBegin,Iterator2,searchEnd)
     Iterator find_first_of(Iterator begin,Iterator end,

               Iterator2 searchBegin,Iterator2,searchEnd,binaryPredicate op)

功能:搜索某一元素第一次出现的位置

用法:

	subVector.clear();
	myvector.clear();
	setValue(myvector, -3, 12);
	setValue(myvector, -3, 6);
	setValue(subVector, -1, 3);

	vector<int>::iterator pos_find_first_of_1;
	pos_find_first_of_1 = find_first_of(myvector.begin(), myvector.end(), subVector.begin(), subVector.end());

	if (pos_find_first_of_1 != myvector.end())
	{
		cout << "子串在原串的位置是(find_first_of):" << distance(myvector.begin(), pos_find_first_of_1) + 1 << endl;
	}
	else
	{
		cout << "没有搜索到子串" << endl;
	}

	vector<int>::reverse_iterator rpos;
	rpos = find_first_of(myvector.rbegin(), myvector.rend(), subVector.begin(), subVector.end());
	cout << "原串中最后一个子串的位置是:" << distance(myvector.begin(), rpos.base()) << endl;

6. adjacent_find

原型:adjacent_find(T first,T last)
     adjacent_find(T first,T last,Pred op)

功能:搜索两个连续相等的元素

最后再说两句:

    上述总结如果有错误的地方欢迎大家指正。小编正在努力学习,文章也会不断更新,敬请关注!

时间: 2024-10-13 11:47:32

C++STL之algorithm(一)的相关文章

【转】STL算法 &lt;algorithm&gt;中各种算法解析

原文:http://blog.csdn.net/tianshuai1111/article/details/7674327 一,巡防算法 for_each(容器起始地址,容器结束地址,要执行的方法) #include <iostream> #include <algorithm> #include <vector> using namespace std; template<class T> struct plus2 { void operator()(T&

[C++STL]算法&lt;algorithm&gt;中各种算法解析

 一,巡防算法 for_each(容器起始地址,容器结束地址,要执行的方法) #include <iostream> #include <algorithm> #include <vector> using namespace std; template<class T> struct plus2 { void operator()(T&x)const { x+=2; } }; void printElem(int& elem) { co

C++标准模板库(STL):algorithm头文件的常用函数之sort()函数

sort()-排序函数 顾名思义,sort就是用来排序的函数,它根据具体情形使用不同的排序算法,效率很高.一般来说,不推荐C语言中的qsort函数,原因是qsort用起来比较麻烦,涉及很多指针的操作.而且sort在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n2)的极端情况 1. 如何使用sort排序 sort函数的使用必须加上头文件"#include<algorithm>"和"using namespace std;",其使用的方式如

STL Sort Algorithm

这个星期看了侯捷先生<STL 源码剖析>算法部分,基本看完了,其中算法比较多,我就重点下Sort在SGI STL中的实现. 1. sort 函数的实现是这样的: template <class RandomAccessIterator> inline void sort(RandomIAccessIterator first , RandomAccessIterator last> { if ( first != last) { __introsort_loop(fisrt,

STL下&lt;algorithm&gt;下的reverse函数

定义: reverse用于C++中,对给定区间所有元素进行排序,是一种反向函数,不具备排序功能.sort函数包含在头文件为#include<algorithm>的C++标准库中. 语法: reverse(first,last) 参数: (1)first表示要排序数组的起始地址:(2)last表示数组结束地址的下一位: 功能: reverse函数用于C++中,对给定区间所有元素进行反转,一般是直接对数组进行反转,例如对数组a[10]反转,reverse(a,a+10).有点类似于sort(sta

C++ STL标准入门

C++:STL标准入门汇总 第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来 的.现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代

c++中STL之heap, priority_queue使用

一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的max-heap实际上是以一个vector表现的完全二叉树(complete binary tree).STL在<algorithm.h>中实现了对存储在vector/deque 中的元素进行堆操作的函数,包括make_heap, pop_heap, push_heap, sort_heap,对不愿

STL list链表的用法详解(转)

本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂.不失为STL的入门文章,新手不容错过! 0 前言 1 定义一个list 2 使用list的成员函数push_back和push_front插入一个元素到list中 3 list的成员函数empty() 4 用for循环来处理list中的元素 5 用STL的通用算法for_each来处理list中的元素 6 用STL的通用算法count_if()来统计list中的元素个数 7 使用count_i

STL 常用方法

1. 选择 C++ 刷算法的理由 1.C++ 速度快(C 不是更快吗,Java 太慢了) 2.C++ 有 STL(什么是 STL)--性能强大,使用方便的标准库 3.如何使用 STL 进行高效刷算法 4.好处:刷算法,学习成本低 5.如何从 C 到 C++(仅基础语法到刷算法程度) 俗话说:磨刀不误砍柴工,不会 C++ 仍然可以刷算法,但是效率相对很低.在 ACM 或各类程序算法竞赛中相比于 Java 代码的冗长,C 的繁琐,Python 的性能低下,C++ 以兼顾简洁和高效脱颖而出. 2. 输