algorithm头文件下的常用函数

algorithm头文件下的常用函数

    • max()、min()和abs()
    • swap()
    • reverse()
    • next_permutation()
    • fill()
    • sort()
      • 如何使用sort排序
      • 如何实现比较函数cmp
        • 基本数据类型数组的排序
        • 结构体数组的排序
        • 容器的排序
    • lower_bound()和upper_bound()

  使用algorithm头文件,需要在头文件下面加一行“ using namespace std;”才能正常使用。

max()、min()和abs()

  max(x,y)和min(x,y)分别返回x和y中的最大值和最小值,且参数必须是两个(可以是浮点数)。如果想要返回三个数xyz中的最大值,可以使用max(x,max(y,z))的写法 。
  abs(x)返回x的绝对值。注意x必须为整数,如果求浮点型的绝对值用math头文件下的fabs。

swap()

  swap(x,y)可以用来交换x和y的值。

reverse()

  reverse(it,it2)可以将数组指针在[it,it2)之间的元素或容器的迭代器在区间范围内反转。

next_permutation()

  给出一个序列在全排列中的下一个序列。
例如:当n=3时的全排列为:123,132,213,231,312,321,这样231的下一个排列是312。

#include
using namespace std;
int main(){
	int a[10] = {1,2,3};
	//a[0]~a[2]之间的序列需要求解next_permutation()
	do{
		printf("%d%d%d\n",a[0],a[1],a[2]);
	}while(next_permutation(a,a+3));
	return 0;
}
输出结果:
123
132
213
231
312
321

  在上述代码中,next_permutaiton()在已经到达全排列的最后一个时会返回false,这样会方便退出循环。

fill()

  fill()可以把数组或容器的某一段区间赋为某个相同的值,和memset不同,这里的赋值可以为任何值。

sort()

  sort()是用来排序的函数。

如何使用sort排序

  使用方式如下:

sort(首地址元素(必填),尾元素地址的下一个地址(必填),比较函数(非必填));

  如果不写比较函数,默认进行递增排序。

int main(){
	int a[6] = {9,4,2,5,6,-1};
	//将a[0]~a[3]从小到大排序
	sort(a,a+4);
	//将a[0]~a[5]从小到大排序
	sort(a,a+6);
}

  同样可对char数组排序,按字典序。

如何实现比较函数cmp

基本数据类型数组的排序

  比较函数不填,默认从小到大排序。如果想要从大到小排序,则要使用比较函数cmp来实现:

bool cmp(int a, int b){//int类型可以更改
	return a > b;//可以理解为当a>b时把a放在b前面
}
sort(a,a+n,cmp);

结构体数组的排序

  现在定义了如下的结构体:

struct node{
	int x,y;
}ssd[10];

  如果想将ssd数组按x从大到小排序:

bool cmp(node a,node b){
	return a.x > b.x;
}

  如果想按x从大到小排序,同时如果x相同就按y的大小从小到大来排序(二级排序):

bool cmp(node a, node b){
	if(a.x == b.x) return a.y<b.y;
	else return a.x > b.x;
};

容器的排序

  在STL容器里,只有vector、string、deque是可以使用sort的。因为set、map这种容器本身就有序。

bool cmp(int a,int b){
	return a>b; //由于vector中的元素是int,因此依旧是int的比较
}
vector<int> vi;
vi.push_back(3);
vi.push_back(1);
vi.push_back(2);
sort(vi.begin(),vi.end(),cmp);

  如果按照字符串长度从小到大排序:

bool cmp(string str1, string str2){
	return str1.length() < str2.length();
}

lower_bound()和upper_bound()

  lower_bound()和upper_bound()需要用在一个有序数组或容器里。
  lower_bound(first,last,val)用来寻找在数组或容器的[first,last)范围内第一个值大于等于val的元素的位置,如果是数组,返回该位置的指针;如果是容器,返回该位置的迭代器。
  upper_bound(first,last,val)用来寻找在数组或容器的[first,last)范围内第一个值大于val的元素的位置,如果是数组,返回该位置的指针;如果是容器,返回该位置的迭代器。
  如果数组或容器里没有需要寻找的元素,则返回可以插入该元素的位置的指针或迭代器(即假设存在该元素,该元素应当在的位置)。

int a[10] = {1,2,2,3,3,3,5,5,5,5};//注意数组下标从0开始
//寻找-1
int* lowerPos = lower_bound(a,a+10,-1); //0

  如果只是想获得欲查元素的下标,就可以不使用临时指针,而直接令返回值减去数组首地址即可

printf("%d",lower_bound(a,a+10,3)-a);//3

你可能感兴趣的:(C算法)