一、头文件<algorithm>

①sort函数

  • sort使用数组元素默认的大小比较运算符进行排序,只有在需要按照特殊依据进行排序时才需要传入额外的比较函数;
  • sort可以给任意对象排序(不一定是内置类型,由此可见sort是模板函数),前提是类型需要定义“小于”运算符,或者在排序时传入一个“小于”函数;
  • 排序对象若存在普通数组中,则用sort(a, a+n)的方式调用;
  • 排序对象若存在vector中,则用sort(v.begin(), v.end())。
  1. #include<algorithm>
  2. const int maxn = ;
  3. int main()
  4. {
  5. int n, a[maxn];
  6. for(int i=;i<n;i++){
  7. scanf("%d",&a[i]);
  8. }
  9. sort(a,a+n);
  10. }

②lower_bound函数

  • 查找大于或者等于x的第一个位置
  • 可以在用sort函数排好序后再使用lower_bound
  1. #include<algorithm>
  2. const int maxn = ;
  3. int main()
  4. {
  5. int n, a[maxn];
  6. for(int i=;i<n;i++)
  7. scanf("%d",&a[i]);
  8. sort(a,a+n);
  9. scanf("%d",&x);
  10. int p = lower_bound(a, a+n, x) - a; //在已排序数组a中寻找x
  11. if(a[p]==x)
  12. printf("%d found at %d\n", x, p+);
  13. }

二、头文件<vector>

①特点:它把一些常用操作“封装”在了vector类型内部(例如:函数size()可以读取其大小)。

②区别于数组:无需另外用一个变量(maxn)指定元素个数。

③优点:可以直接赋值,还可以作为函数的参数或者返回值。

vector是一个模板类:

  1. int main()
  2. {
  3. vector<int> a; //声明一个不定长int型数组a
  4. a.push_back(); //在尾部添加元素1
  5. a.pop_back(); //在尾部删除元素
  6. cout<<a.size(); //输出a的大小
  7. a.resize(); //修改a的大小为4
  8. a.clear(); //清空a,此时a的大小为0
  9. bool isEmpty = a.empty(); //a为空,则isEmpty被赋值为true
  10. }

三、头文件<set>

定义:set是数学上的集合——每个元素最多只能出现一次。

特点:和sort一样,自定义类型也可以构造set,但必须定义“小于”运算符。

性质:set中元素已从小到大排好序。

题目:输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出,单词不区分大小写。

  1. #include<iostream>
  2. #include<string>
  3. #include<set>
  4. #include<sstream>
  5. using namespace std;
  6.  
  7. set<string> dict;       //声明string集合
  8. string s, buf;
  9.  
  10. int main()
  11. {
  12. while(cin >> s) { //注意:string已经定义了"小于"运算符,可直接使用set保存单词集合
  13. for(int i = ; i < s.length(); i++) //利用了set的性质,一个for循环即可从小到大遍历所有元素
  14. if(isalpha(s[i]))   //判定s[i]是否为字母
  15. s[i] = tolower(s[i]); //全都转为小写
  16. else
  17. s[i] = ' ';
  18. stringstream ss(s);
  19. while(ss >> buf)
  20. dict.insert(buf);
  21. }
  22. for(set<string>::iterator it = dict.begin(); it != dict.end(); ++it)//利用了set的性质,一个for循环即可从小到大遍历所有元素
  23. cout << *it << "\n"; //迭代器it的用法之一
  24. return ;
  25. }

四、头文件<map>

定义:map就是从键(key)到值(value)的映射。

特点:重载了[]运算符,map像是数组的“高级版”。

举例:用map<string,int> month_name来表示“月份名字到月份编号”的映射,然后用month_name["July"]=7这样的方式来赋值。

题目:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排而得到输入文本中的另外一个单词。字母不区分大小写。

  1. #include<iostream>
  2. #include<string>
  3. #include<cctype>
  4. #include<vector>
  5. #include<map>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. map<string,int> cnt;
  10. vector<string> words;
  11.  
  12. string repr(string s) //将单词s进行标准化
  13. {
  14. string ans = s;
  15. for(int i = ; i < ans.length(); i++)
  16. ans[i] = tolower(ans[i]);
  17. sort(ans.begin(), ans.end());
  18. return ans;
  19. }
  20.  
  21. int main() {
  22. int n = ;
  23. string s;
  24. while(cin >> s) {
  25. if(s[] == '#') break;
  26. words.push_back(s);
  27. string r = repr(s);
  28. if(!cnt.count(r)) //set和map都支持insert、find、count和remove操作,并且可以按照从小到大的顺序循环遍历其中的元素
  29. cnt[r] = ;
  30. cnt[r]++;
  31. }
  32. vector<string> ans;
  33. for(int i = ; i < words.size(); i++)
  34. if(cnt[repr(words[i])] == )
  35. ans.push_back(words[i]);
  36. sort(ans.begin(), ans.end());
  37. for(int i = ; i < ans.size(); i++)
  38. cout << ans[i] << "\n";
  39. return ;
  40. }

小结:set和map都支持insert、find、count和remove操作,并且可以按照从小到大的顺序循环遍历其中的元素。此外,map还提供了“[]”运算符,使得map可以像数组一样使用。

五、头文件<stack>

  • 定义:stack<int> s
  • 入栈:push()
  • 出栈:pop()
  • 取栈顶元素:top()

题目:Uva12096

  1. #include<iostream>
  2. #include<string>
  3. #include<set>
  4. #include<map>
  5. #include<stack>
  6. #include<vector>
  7. #include<algorithm>
  8. using namespace std;
  9.  
  10. #define ALL(x) x.begin(),x.end()
  11. #define INS(x) inserter(x,x.begin())
  12.  
  13. typedef set<int> Set;
  14. map<Set,int> IDcache; //把集合映射成ID
  15. vector<Set> Setcache; //根据ID取集合
  16.  
  17. //查找给定集合x的ID。如果找不到,分配一个新ID
  18. int ID (Set x) {
  19. if (IDcache.count(x)) return IDcache[x];
  20. Setcache.push_back(x); //添加新集合
  21. return IDcache[x] = Setcache.size() - ;
  22. }
  23.  
  24. int main () {
  25. int T;
  26. cin >> T;
  27. while(T--) {
  28. stack<int> s; //题目中的栈
  29. int n;
  30. cin >> n;
  31. for(int i = ; i < n; i++) {
  32. string op;
  33. cin >> op;
  34. if (op[] == 'P') s.push(ID(Set()));
  35. else if (op[] == 'D') s.push(s.top());
  36. else {
  37. Set x1 = Setcache[s.top()]; s.pop();
  38. Set x2 = Setcache[s.top()]; s.pop();
  39. Set x;
  40. if (op[] == 'U') set_union (ALL(x1), ALL(x2), INS(x));
  41. if (op[] == 'I') set_intersection (ALL(x1), ALL(x2), INS(x));
  42. if (op[] == 'A') { x = x2; x.insert(ID(x1)); }
  43. s.push(ID(x));
  44. }
  45. cout << Setcache[s.top()].size() << endl;
  46. }
  47. cout << "***" << endl;
  48. }
  49. return ;
  50. }

六、头文件<queue>

  • 定义:queue<int> s
  • 入队:push()
  • 出队:pop()
  • 取队首元素:front()

【优先队列】

区别于队列:先出队列的元素是队列中优先级最高的元素。

声明:priority_queue<int> pq     //pq是一个“越小的整数优先级越低的优先队列”

取队首元素:top()

注:自定义类型也可以组成优先队列,但必须为每个元素定义一个优先级。

初涉算法——STL初步的更多相关文章

  1. 变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...

  2. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...

  3. 算法竞赛入门经典5.2 STL初步

    1. 排序和检索,学会使用sort排序,以及low_bound函数 Raju and Meena love to play with Marbles. They have got a lot of m ...

  4. (STL初步)不定长数组:vector

    STL是指C++的标准模板库.(存储着一些常用的算法和容器) vector是一个不定长数组.它把一些常用的操作”封装“在vector类型内部. 例如,a是一个vector.1对元素的操作有,可以用a. ...

  5. 51nod 1785 数据流中的算法 | STL的应用

    51nod 1785 数据流中的算法 题面 动态求平均数.方差.中位数. 题解 这道题的坑: 平均数在答案中是向下取整输出并在后面添加".00" 方差:平方的平均数减去平均数的平方 ...

  6. 【STL初步】不定长数组:vector + 集合:set + 映射:map

    一.vector 为了节省空间,有时我们会使用动态数组vector. 定义动态数组 vector<类型名>变量名 vector<int>que //定义que为一个int类型的 ...

  7. BKDRHash算法的初步了解

    字符串hash最高效的算法,  搜了一下,  原理是: 字符串的字符集只有128个字符,所以把一个字符串当成128或更高进制的数字来看,当然是唯一的 这里unsigned不需要考虑溢出的问题,  不过 ...

  8. 2020.2.27——STL初步

    注:本文主要针对STL中的常用的操作进行总结 目录: 1.swap 2.sort 3.reverse 4.min,max(比较简单,暂且略过) 5._gcd 6.lower_bound &&a ...

  9. STL初步学习(queue,deque)

    4.queue queue就是队列,平时用得非常多.栈的操作是只能是先进先出,与栈不同,是先进后出,与之后的deque也有区别.个人感觉手写队列有点麻烦,有什么head和tail什么的,所以说 STL ...

随机推荐

  1. js 校验身份证号

    根据地区编码.身份证格式.18位身份证需要验证最后一位校验位 //校验身份证 function IdentityCodeValid(code) { var city = { 11: "北京& ...

  2. pymyspl模块

    pymysql的下载和使用 该模块本质就是一个套接字客户端软件,使用前需要事先安装,能够让我们在 Python程序中操作数据库. pymysql模块的下载: 在Python安装文件中找到scripts ...

  3. ruby配置镜像源

    1.打开电脑的cmd窗口,输入如下命令即可查看gem镜像: gem sources l 或是直接使用 gem sources 查询结果如下: C:\Users\Administrator>gem ...

  4. BAT-运行程序

    @echo offrem copy C:\Users\Administrator\Desktop\0000\123.txt C:\Users\Administrator\Desktop\0000\45 ...

  5. 使用ABAP CDS视图创建服务

    介绍本文介绍使用ABAP Core Data Services创建OData服务的最快方法. 给出了有关@ OData.publish注释利用率,对数据源CDS实体的引用和从DDIC结构导入的详细信息 ...

  6. 北京Uber优步司机奖励政策(1月22日

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. 北京Uber优步司机奖励政策(12月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. Maven项目配置tomcat插件实现项目自动部署到远程服务器

    1.tomcat配置 在tomcat目录中的conf目录下找到tomcat-users.xml配置文件,然后搜索tomcat-users,进行tomcat用户的角色和权限配置,如下: <tomc ...

  9. JavaWeb——JavaWeb开发入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  10. Visual Studio 智能提示功能消失解决办法

    步骤如下: 开始菜单 -->所有程序-->Visual Studio 2012文件夹 --> Visual Studio Tools --> Developer Command ...