关于STL的小结(持续更新中)

本文对比了C++ STL中的sort函数与快速排序、归并排序及希尔排序的效率,并介绍了如何利用cmp函数实现从大到小排序。此外,还介绍了set容器的基本用法。

前言
最近又初学完了紫书第五章,特写此篇博客来作为一个小结,以备日后用来复习
———————————————————————————————————

正文

看完了紫书第五章,才发现自己的STL原来是这么薄弱。。
我们先一个一个说吧:

  • sort

sort是一个STL中所给出的一个排序的函数,其默认为从小到大的排序
使用语句

vector<int> v;//不定长数组
sort(v.begin(),v.end());//c++默认为左闭右开

由于STL中的sort只支持从小到大,固要想其实现从大到小,只能运用cmp

bool cmp(int a,int b)
{
	return a>b;
}
vector<int> v;
sort(v.begin(),v.end(),cmp);

通过实践我们发现
在有5e6个数,数据范围为1~1e8的时候
效率比较为
快排>sort>归并>希尔
但快排和sort的效率之间相差并不大~~(可能是我cpu太渣)~~
所以如果没有卡常需求的同学,用sort还是比较好的
下面附上时间比较的代码

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <algorithm>
#define random(a,b) (rand()%(b-a+1)+a)

using namespace std;

const int N=10000000+1;
int letter[N];
int letter2[N];
int letter3[N];
int letter4[N];
int r[N];

inline void _srand(int a,int b)//a:个数 b:范围
{
	srand((unsigned)time(NULL));
	for(int i=0; i<a; i++)
		letter[i]=random(1,b);
	for (int i=0; i<a; i++)
		letter2[i]=letter[i];
	for (int i=0; i<a; i++)
		letter3[i]=letter[i];
	for (int i=0;i<a;i++)
		letter4[i]=letter[i];
}

void guibing_sort(int a[],int s,int t)
{
	int m,i,j,k;
	if (s==t)
		return;
	m=(s+t)/2;
	guibing_sort(a,s,m);
	guibing_sort(a,m+1,t);
	i=s;
	j=m+1;
	k=s;
	while (i<=m&&j<=t)
	{
		if (a[i]<=a[j])
			r[k]=a[i],i++,k++;
		else
			r[k]=a[j],j++,k++;
	}
	while (i<=m)
		r[k]=a[i],i++,k++;
	while (j<=t)
	{
		r[k]=a[j];
		j++;
		k++;
	}
	for (i=s; i<=t; i++)
		a[i]=r[i];
}

void kuaipai_sort(int a[],int l,int r)
{
	int i,j,mid,p;
	i=l,j=r;
	mid=a[(l+r)/2];
	do
	{
		while (a[i]<mid)	i++;
		while (a[j]>mid)	j--;
		if (i<=j)
		{
			p=a[i];
			a[i]=a[j];
			a[j]=p;
			i++,j--;
		}
		
	}
	while (i<=j);
	if (l<j) kuaipai_sort(a,l,j);
	if (i<r) kuaipai_sort(a,i,r);
}

void xier_sort(int a[], int n)
{
	int i, j, gap;

	for (gap = n / 2; gap > 0; gap /= 2) //步长
		for (i = 0; i < gap; i++)        //直接插入排序
		{
			for (j = i + gap; j < n; j += gap)
				if (a[j] < a[j - gap])
				{
					int temp = a[j];
					int k = j - gap;
					while (k >= 0 && a[k] > temp)
					{
						a[k + gap] = a[k];
						k -= gap;
					}
					a[k + gap] = temp;
				}
		}
}

int main()
{
	int a,b;
	cin>>a>>b;//数据个数,范围
	_srand(a,b);
	cout<<endl;

	clock_t time;
	time=clock();
	//sort_insert();
	guibing_sort(letter,1,a);
	time=clock()-time;
	cout<<"归并:"<<"Spend "<<(int)time<<" ms."<<endl;

	clock_t time1;
	time1=clock();
	kuaipai_sort(letter2,1,a);
	time1=clock()-time1;
	cout<<"快排: "<<"Spend "<<(int)time1<<" ms."<<endl;

	clock_t time2;
	time2=clock();
	xier_sort(letter3,a);
	time2=clock()-time2;
	cout<<"希尔:"<<"Spend "<<(int)time2<<" ms."<<endl;
	
	clock_t time3;
	time3=clock();
	sort(letter4,letter4+a);
	time3=clock()-time3;
	cout<<"sort: "<<"Spend "<<(int)time3<<" ms."<<endl;


	return 0;
}
  • set
    set是c++中的一个现成的容器,他可以实现排序+去重,默认为优先级从小到大,
    其具体操作为:
int a;
set <int> st;
st.insert(a);//在set中插入插入a这个元素
st.count(a);//在set中查找是否有a这个元素指向被搜索到的元素的迭代器,如果找不到,则返回指向末尾的迭代器。
for (set<int>::iterator it;it!=st.end();it++)
    cout<<*it<<" ";//遍历set中的元素
cout<<endl;

如果 set 对象是 const 限定的,函数返回类型为 const_iterator,否则返回 iterator。

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值