c++常用STL总结(排序与查找算法)

排序算法 sort

默认将数组进行从小到大排序
Sort(数组名+n1,数组名+n2) 将数组下标为[n1,n2)的元素进行排序,注意左闭右开

Sort(数组名+n1,数组名+n2,greater< T >()); 将数据类型为基本数据类型为T的数组从大到小进行排序

Sort(数组名+n1,数组名+n2,排序规则结构名()); 用自定义的排序规则,对任何类型T的数组排序

有些时候不需要写成结构形式,直接写一个函数就行
排序规则结构:
Struct 结构名
{
bool operator() (const T&a1,const T&a2) const{
若a1应该在a2前面,则返回true。否则返回false;
};
}

struct Stu
{
	string name;
	int grades;
};

//自定义排序规则,以分数从小到大对学生进行排序 
struct Rule{
	bool operator()(const Stu & a1,const Stu &a2)const
	{
		if(a1.grades<a2.grades)  return true;
	}	
};
//也可以直接写函数
/*
bool Rule(const Stu & a1,const Stu &a2)
{
		if(a1.grades<a2.grades)  return true;
}
调用方式:sort(stu,stu+4,Rule);Rule后面不加括号了
*/
int main()
{
	Stu stu[4]={{"aaa",98},{"bbb",56},{"ccc",78},{"ddd",43}};
	sort(stu,stu+4,Rule());     
	for(int i=0;i<4;i++)
	{
		cout<<stu[i].name<<" ";
		cout<<stu[i].grades<<endl;
	}

运行结果:
从小到大排序

将整个数组进行排序: sort(数组名,数组名+sizeof(数组名)/sizeof(T));
对容器进行排序: sort(a.begin(),a.end());

二分查找算法

二分查找算法binary_search

(1)在从小到大排好序的基本类型数组上进行二分查找

binary_search(数组名+n1,数组名+n2,值) —n可以为变量,查找下标为[n1,n2)的元素
返回值为true(找到)或false(没找到)
“等于”的含义:a<b和a>b都不成立--------对于基本数据类型来说就是等于

	int array[10]={3,6,8,2,9,34,76,16,98,25};
	cout<<binary_search(array,array+10,3);
	//输出:1(true)存在 

(2)用自定义排序规则排好序的、元素为任意的T类型的数组中进行二分查找
binary_search(数组名+n1,数组名+n2,值,排序规则结构名());
查找时的排序规则必须和排序时的规则一致
“等于”的含义:a必须在b前面和b必须在a前面都不成立

struct Rule
{
	bool operator()(const int &a1,const int &a2)const
	{
		return a1%10<a2%10;   //以个位数从小到大进行排序 
	}	
};
int main()
{
	int array[5]={23,65,74,87,89};
	sort(array,array+5,Rule());
	cout<<65<<" :"<<binary_search(array,array+5,65,Rule())<<endl;    
	cout<<7<<" :"<<binary_search(array,array+5,7,Rule())<<endl;     //排序sort的相等不是==而是a与b谁在前谁在后无所谓,与排序规则有关
	//在用二分查找算法之前必须保证数组已经排好序了 
	//查找时的排序算法必须与数组实际排序算法一致,如果此时的数组排序规则与二分查找指定的不一样,查找就
	//没有意义,甚至会出现不能成功查找到的情况,不指定规则对基本数据类型来说就是从小到大的规则 
	cout<<74<<" :"<<binary_search(array,array+5,74)<<endl;     //输出不存在,array此时的排序为自定义类型 
	return 0;
} 

二分查找下界lower_bound

(1)在对元素类型为T的从小到大排好序的基本类型的数组中进行查找
T * lower_bound(数组名+n1,数组名+n2,值);
返回一个指针T *p;
*p是查找区间里下标最小的,大于等于“值”的元素。如果找不到,p指向下标为n2的元素,即数组最后一个元素,如果找到即指向被找到的元素
(2)自定义排序规则

T* lower_bound(数组名+n1,数组名+n2,值,排序规则结构名()); 与基本数据类型的相似用法,注意事项与binary_search相同 查找可用排在值后面的元素

二分查找上界upper_bound

(1)T * upper_bound(数组名+n1,数组名+n2,值);

返回一个指针T *p; *p是查找区间里下标最小的,大于“值”的元素。

(2) T* upper_bound(数组名+n1,数组名+n2,值,Rule()); 查找必须排在值后面的元素
用法几乎和lower_bound相似,只有一点不同:lower_bound取到了相等,upper_bound没有取到,一个连续重复多次的数所在的区间下界是能取到的,上界是取不到的,即重复多次的数所在的区间为[lower_bound,upper_bound)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值