STL的常见用法

红太狼 2024-04-18 07:24 199阅读 0赞

1.vector

  1. #include <cstdio>
  2. #include <vector>
  3. using namespace std;
  4. vector<int> arr;
  5. int n;
  6. int main()
  7. {
  8. scanf("%d",&n);
  9. //为arr分配初始容量为n+1个元素
  10. //arr的下标为0-n
  11. //默认所有元素的值都是0
  12. arr.resize(n+1);
  13. int i;
  14. //为从下标为1至下标为n的元素赋值
  15. for(i=1;i<=n;i++)
  16. {
  17. scanf("%d",&arr[i]);
  18. }
  19. //输出从下标0到下标n的元素
  20. for(i=0;i<=n;i++)
  21. {
  22. if(i>0)
  23. printf(" ");
  24. printf("%d",arr[i]);
  25. }
  26. //输出的第一个元素值应该是0 因为第一个元素并未被赋值
  27. printf("\n");
  28. return 0;
  29. }

2019090316505510.png

另外,如果不知道容器中一共需要存储多少个元素,可以暂不指定大小,先往容器中插入,这样整个数组就是动态的。

  1. #include <cstdio>
  2. #include <vector>
  3. using namespace std;
  4. vector<int> arr;
  5. int n;
  6. int main()
  7. {
  8. scanf("%d",&n);
  9. int temp;
  10. int i;
  11. //向容器中插入n个元素
  12. for(i=1;i<=n;i++)
  13. {
  14. scanf("%d",&temp);
  15. arr.push_back(temp);
  16. }
  17. //输出从下标0到下标n-1的元素
  18. for(i=0;i<n;i++)
  19. {
  20. if(i>0)
  21. printf(" ");
  22. printf("%d",arr[i]);
  23. }
  24. printf("\n");
  25. //获取动态数组的长度
  26. int len=arr.size();
  27. printf("The length of arr is %d.\n",len);
  28. return 0;
  29. }

20190903165722331.png

利用push_back(temp)向容器中添加值为temp的元素,利用size()获取动态数组当前存储元素的个数。

此外,pop_back()会删除动态数组中最后一个元素,如下所示(先往数组中添加n个元素,然后从后往前删除3个元素):

  1. #include <cstdio>
  2. #include <vector>
  3. using namespace std;
  4. vector<int> arr;
  5. int n;
  6. int main()
  7. {
  8. scanf("%d",&n);
  9. int temp;
  10. int i;
  11. //向容器中插入n个元素
  12. for(i=1;i<=n;i++)
  13. {
  14. scanf("%d",&temp);
  15. arr.push_back(temp);
  16. }
  17. //输出从下标0到下标n-1的元素
  18. for(i=0;i<n;i++)
  19. {
  20. if(i>0)
  21. printf(" ");
  22. printf("%d",arr[i]);
  23. }
  24. printf("\n");
  25. for(i=0;i<3;i++)
  26. {
  27. arr.pop_back();
  28. }
  29. //获取动态数组的长度
  30. int len=arr.size();
  31. //输出动态数组中现存的所有元素
  32. for(i=0;i<len;i++)
  33. {
  34. if(i>0)
  35. printf(" ");
  36. printf("%d",arr[i]);
  37. }
  38. printf("\n");
  39. printf("The length of arr is %d.\n",len);
  40. return 0;
  41. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY3Njg4MQ_size_16_color_FFFFFF_t_70

此外,容器可以在声明的同时指定元素个数,一般写在函数体中,如下所示:

  1. #include <cstdio>
  2. #include <vector>
  3. using namespace std;
  4. int n;
  5. int main()
  6. {
  7. scanf("%d",&n);
  8. //为arr分配初始容量为n+1个元素
  9. vector<int> arr(n+1);
  10. //arr的下标为0-n
  11. //默认所有元素的值都是0
  12. arr.resize(n+1);
  13. int i;
  14. //为从下标为1至下标为n的元素赋值
  15. for(i=1;i<=n;i++)
  16. {
  17. scanf("%d",&arr[i]);
  18. }
  19. //输出从下标0到下标n的元素
  20. for(i=0;i<=n;i++)
  21. {
  22. if(i>0)
  23. printf(" ");
  24. printf("%d",arr[i]);
  25. }
  26. //输出的第一个元素值应该是0 因为第一个元素并未被赋值
  27. printf("\n");
  28. return 0;
  29. }

2.map

map<数据类型1,数据类型2>表示以数据类型1为下标类型的数组。什么意思呢,就是说数据类型1相当于数组的index,在数组int a[5]中,a[0]即第一个元素,0就是其index。那么在map mp中,mp[“张三”]=1,”张三”就是mp[“张三”]的下标。

以下面一个例题为例:

输入一组姓名和一组查询,你需要做的是对每一个查询输出该姓名出现的次数。

输入格式:输入姓名的个数n,查询的个数m,随后n行输入n个姓名,随后m行输入m个需要查询出现次数的姓名。

输出格式:name共出现过num次,name为查询时输入的姓名,num为name出现的次数。

代码如下:

  1. #include <cstdio>
  2. #include <map>
  3. #include <iostream>
  4. using namespace std;
  5. int n,m;
  6. map<string,int> dp;
  7. int main()
  8. {
  9. //n为输入的姓名的个数
  10. //m为查询的个数
  11. cin>>n>>m;
  12. int i;
  13. string temp;
  14. for(i=0;i<n;i++)
  15. {
  16. cin>>temp;
  17. dp[temp]++;
  18. }
  19. for(i=0;i<m;i++)
  20. {
  21. cin>>temp;
  22. cout<<temp<<"共出现过"<<dp[temp]<<"次"<<endl;
  23. }
  24. return 0;
  25. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY3Njg4MQ_size_16_color_FFFFFF_t_70 1

从上面的代码也可以看出,map dp中未曾出现过的index其对应的元素值默认为0,比如index中已经出现过”张三”,并令dp[“张三”]=1,index中没有出现过李四,那么访问dp[“李四”]时其值为0。同理map中未曾出现过的index其对用的元素值默认也为0。

另外,map还有查找某个index存在与否的功能,将上面的例题稍加改变,最后查询结果为该姓名是否出现过,若出现过则显示Yes,未出现过则显示No。代码如下:

  1. #include <cstdio>
  2. #include <map>
  3. #include <iostream>
  4. using namespace std;
  5. int n,m;
  6. map<string,int> dp;
  7. int main()
  8. {
  9. //n为输入的姓名的个数
  10. //m为查询的个数
  11. cin>>n>>m;
  12. int i;
  13. string temp;
  14. for(i=0;i<n;i++)
  15. {
  16. cin>>temp;
  17. dp[temp]++;
  18. }
  19. for(i=0;i<m;i++)
  20. {
  21. cin>>temp;
  22. if(dp.find(temp)==dp.end())
  23. {
  24. cout<<"No"<<endl;
  25. }
  26. else
  27. {
  28. cout<<"Yes"<<endl;
  29. }
  30. }
  31. return 0;
  32. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY3Njg4MQ_size_16_color_FFFFFF_t_70 2

dp.find(index)==dp.end()则表示未出现过以index为下标的元素。

3.set

set翻译成中文就是集合,学过高中数学的都知道,集合中是不允许相同元素存在的,因此在遇到有去重需求的问题时,采用set即可。set的底层使用了特殊的数据结构,可以快速有效地进行插入、删除和查找。

声明:

  1. //声明
  2. set<int> s;

插入操作:

  1. //插入操作
  2. int a=5;
  3. s.insert(a);

获取set中元素的个数:

  1. int num=s.size();

遍历:

  1. #include <cstdio>
  2. #include <set>
  3. using namespace std;
  4. int n;
  5. set<int> s;
  6. int main()
  7. {
  8. //n为输入的整数的个数
  9. scanf("%d",&n);
  10. int i;
  11. int temp;
  12. for(i=0;i<n;i++)
  13. {
  14. scanf("%d",&temp);
  15. s.insert(temp);
  16. }
  17. //遍历
  18. for(set<int>::iterator it=s.begin();it!=s.end();it++)
  19. {
  20. if(it!=s.begin())
  21. printf(" ");
  22. int now=*it;
  23. printf("%d",now);
  24. }
  25. return 0;
  26. }

20190903201931379.png

查找(类似map):

  1. if(s.find(temp)==s.end())
  2. {
  3. printf("查找不到\n");
  4. }
  5. else
  6. {
  7. printf("能查找到\n");
  8. }

4.pair

pair翻译成中文就是“双”、“对”的意思,因此pair<数据类型1,数据类型2>就表示一对数据类型,pair可以作为元素插入到map中,当然也可以从map中读出pair,访问pair中前面的元素用first,访问pair中后面的元素用second。

  1. //前面有过声明语句pos<string,int> ans;
  2. for(map<string,int>::iterator it=ans.begin();it!=ans.end();it++)
  3. {
  4. pair<string,int> now=*it;
  5. cout<<now.first<<" "<<now.second<<endl;
  6. }

5.priority_queue

priority_queue翻译成中文是“优先队列”的意思,是STL中提供的模板,其底层是用堆实现的,顶部或者说优先出队的元素是所有元素中最大或者最小的,也就是对应着大顶堆和小顶堆,默认是大顶堆。将优先队列作大顶堆用还是作小顶堆用,是在声明时决定的。

声明一个大顶堆的语句如下:

  1. //采用默认的优先队列声明方式即可
  2. priority_queue<int> que;

或者如下声明,是在强调que是一个大顶堆:

  1. priority_queue<int,vector<int>,less<int> > que;

声明一个小顶堆的语句如下:

  1. priority_queue<int,vector<int>,greater<int> > que;

有两点需要注意,一是在声明大顶堆的时候用less,而在声明小顶堆时用greater;二是声明语句应避免出现两个’>’连用,如果连用编译器就会报错,中间需要用一个空格隔开。

获取堆顶元素:

  1. int now=que.top();

将堆顶元素拿出:

  1. que.pop();

获取堆中元素的个数:

  1. int length=que.size();

判断堆是否已经为空:

  1. bool isEmpty=que.empty();

6.

中提供了很多方法,可以用一行代码完成一些原本需要好多行代码才能完成的操作,可以减少代码量使逻辑更加清晰。

①fill

fill方法用于给数组中的元素指定初始值,可以是常规数组,也可以是vector,使用方法如下:

第一个参数是指定元素值的起始位置,第二个参数是指定元素值的中止位置的后一个元素的位置,第三个参数是指定值。

  1. int arr[100];
  2. int n=100;
  3. fill(a,a+n,10);

以上代码是对数组arr中的全部元素赋初始值为10。

  1. vector<int> arr;
  2. arr.resize(100);
  3. int n=100;
  4. fill(arr.begin(),arr.end(),10);

以上代码也是对数组arr中的全部元素赋初始值为10。

②reverse

reverse翻译成中文是“翻转”的意思,功能是把数组中的元素倒过来放置,{1,2,3,4,5}反转完变成{5,4,3,2,1},操作对象可以是数组,也可以是vector,使用方法如下:

  1. int arr[100];
  2. int n=100;
  3. //...经过一系列初始化...
  4. reverse(arr,arr+n);

以上代码是将从地址为arr的元素起往后n个元素倒置。

  1. vector<int> arr;
  2. //...经过一系列初始化...
  3. reverse(arr.begin(),arr.end());

以上代码是将数组arr中全部的元素倒置。

7.

是一个跟数学运算有关的库文件,里面提供了很多数学函数可以直接拿来用。

①向下取整、向上取整与四舍五入:

  1. #include <cstdio>
  2. #include <cmath>
  3. using namespace std;
  4. int n;
  5. int main()
  6. {
  7. scanf("%d",&n);
  8. double sum=0.0;
  9. int i;
  10. int temp;
  11. for(i=0;i<n;i++)
  12. {
  13. scanf("%d",&temp);
  14. sum+=temp;
  15. }
  16. printf("真实结果为%lf.\n",sum/n);
  17. int ans=floor(sum/n);
  18. printf("向下取整的结果为%d.\n",ans);
  19. ans=ceil(sum/n);
  20. printf("向上取整的结果为%d.\n",ans);
  21. ans=round(sum/n);
  22. printf("四舍五入的结果为%d.\n",ans);
  23. return 0;
  24. }

以上代码描述的是一个求解平均数的程序,floor的中文意思是“地板”,对应向下取整;ceil的中文意思是“天花板”,对应向上取整;round的中文意思是“圆的”,四舍五入显得比较“圆滑”。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY3Njg4MQ_size_16_color_FFFFFF_t_70 3

②pow函数

pow函数用于求a的b次方,pow(a,b),最原始的pow函数无论是参数还是返回值都是double类型的,因此最好在调用该函数的时候都先将类型转换成double再传入函数。我们都知道呈指数增长是间非常可怕的事情,在运算结果过大时,将其返回到long long int型变量中,其值可能为负数,如下所示:

  1. #include <cstdio>
  2. #include <cmath>
  3. using namespace std;
  4. int n;
  5. int main()
  6. {
  7. long long int a=10000000000;
  8. long long int b=10000000000;
  9. long long int ans=pow(a,b);
  10. printf("%lld\n",ans);
  11. return 0;
  12. }

20190906205721502.png

欢迎大家关注/订阅我的微信公众号Code Art Online,我会在我的公众号分享个人见闻,发现生活趣味;这里不仅有0和1,还有是诗和远方↓↓↓

20200227123106884.jpg

发表评论

表情:
评论列表 (有 0 条评论,199人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ STL优先队列常

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级

    相关 STL详细

    需要头文件 \include<algorithm> using namespace std;   这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二

    相关 STL map 详细

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值)的数据 处理能力。 需要的库 i