为人熟知的pair类型

注意:pair对于==, !=, <, >, <=, >=进行了重载,提供first第一关键字,second第二关键字的比较方法。

再谈STL

STL有三大件:

  1. 容器
  2. 算法
  3. 迭代器

迭代器的使用

  1. #include <vector>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<int> myv;
  7. myv.push_back(1);
  8. myv.push_back(2);
  9. myv.push_back(3);
  10. vector<int>::iterator it;
  11. for(it = myv.begin(); it != myv.end(); it++)
  12. {
  13. cout << *it << " ";
  14. }
  15. puts("");
  16. vector<int>::reverse_iterator rit;
  17. for(rit = myv.rbegin(); rit != myv.rend(); rit++)
  18. {
  19. cout << *rit << " ";
  20. }
  21. return 0;
  22. }

常用的STL容器

顺序容器

有四个vector, string, deque, list

vector(向量)

优点:

  • 可以在末尾快速插入以及删除
  • 支持随机访问

缺点:

  • 在中间插入或者删除像 数组 一样,移动大量元素
  • 当大小不够时,按照两倍大小重新分配,并且移动。

构造方式

  1. #include <vector>
  2. #include <iostream>
  3. using namespace std;
  4. #define V v4 //更改这里可以查看不同效果!
  5. vector<int> v1;
  6. vector<int> v2(20);//指定了初始的size为20,再执行push_back是从21开始!!前面的20个元素的值是0
  7. vector<int> v3(20, 2);//指定了初始的size为20,再执行push_back是从21开始!!前面的20个元素的值是2
  8. int a[] = {1, 2, 3, 4};
  9. vector<int> v4(a, a+4);//从数组中获取
  10. int main()
  11. {
  12. for(int i = 1; i <= 100; i++)
  13. {
  14. V.push_back(i);
  15. printf("%dsize:%d, cap:%d\n",i, V.size(), V.capacity());
  16. }
  17. for(int i = 0; i < V.size(); i++)
  18. cout << V[i] << " ";
  19. return 0;
  20. }

拥有的常用的成员函数(java人称方法)

常用的仅仅列举 不说明!

empty()

size()

[]

reserve(n)分配n个元素的存储空间

注意:这一个仅仅是修改一开始的capacity,不影响size

使用可以直接给定一个空间,避免空间不够而进行频繁增加删除,当做更加优秀的数组使用

capacity

resize()调整size,比原来小时,删除多余的;比原来大时,补0

push_back()

insert(pos, elem)把某一个值插入到pos之前(注意这要耗费许多时间!)

pos是迭代器!

front()获取第一个值

back()获取最后一个值

erase()有重载:

  1. 一个参数,迭代器,删除这一个位置元素
  2. 两个迭代器,删除后这两个迭代器的区间中的元素。

clear()

begin(), end(), rbegin(), rend()

string

构造方式

  1. string()
  2. string(char*)
  3. string(string)

成员函数

empty()

size()

length()貌似除了类型与上面的有区别,其他的没有区别

[]

at()和上面一样

compare(const string &str)比较

如果自己大,返回1,形参大,返回-1,否则返回0

append(const string &str)在末尾增加字符串

insert(pos, elem)把某一个值插入到pos之前(注意这要耗费许多时间!)

pos可以是迭代器,也可以是数字!

但是elem一定是字符串!

find(字符或字符串, 位置)注意:如果找不到,返回值是一个迷,所以尽量不要用

replace()

例子:

  1. string s1("abcdefg");
  2. string s2(s1);
  3. s1.replace(3, 3, "lll");//起始位置,长度,替换内容
  4. cout << s1;
  5. string::iterator it1 = s2.begin()+1;
  6. string::iterator it2 = s2.end()-1;
  7. s2.replace(it1, it2, "11");//[ , )
  8. cout << s2 ;

substr并不改变原来的值

  1. string s1("abcdefg");
  2. cout << s1.substr(3) << "\n";//defg
  3. cout << s1.substr(3, 3);//def

clear(), erase清空。

erase(idx);从idx(数字)处删除之后的内容

erase(idx, len)从idx(数字)处删除之后的长度为len内容

deque

deque与vector相比,他并不是由一个整体的内存存储的,而是由多个连续的内存块存储的,所以在头部以及尾部插入元素比较快,并且也支持随机访问。

构建方式:

  1. #include <deque>
  2. #include <iostream>
  3. using namespace std;
  4. #define DQ dq3
  5. int main()
  6. {
  7. deque<int>dq1;
  8. deque<int>dq2(2);
  9. deque<int>dq3(2, 3);
  10. deque<int>dq4(dq1);
  11. deque<int>dq5(dq1.begin(), dq1.end());
  12. deque<int>::iterator it;
  13. DQ.push_back(8);
  14. DQ.push_front(0);
  15. for(it = DQ.begin(); it != DQ.end(); it++){
  16. cout << *it;
  17. }
  18. return 0;
  19. }

empty()

size()

front()

back()

push_front()

pop_front()

push_back()

pop_back()

erase()清除一个或者几个值

clear()全部清除

begin(), end(), rbegin(), rend()

list

可以快速插入以及删除元素,但是不支持随机访问。

empty()

size()

push_front()

pop_front()

push_back()

pop_back()

removeRemoves every element in the list equal to value.

  1. list<int> l1({1, 2, 3, 4, 4, 4});
  2. l1.remove(4);
  3. list<int>::iterator it;
  4. for(it = l1.begin(); it != l1.end(); it++)
  5. {
  6. cout << *it << " ";//1 2 3
  7. }

remove_if()

  1. #include <list>
  2. #include <iostream>
  3. using namespace std;
  4. #define DQ dq3
  5. bool judge(int val)
  6. {
  7. return val&1;
  8. }
  9. int main()
  10. {
  11. list<int> l1({1, 2, 3, 4, 5, 6});
  12. l1.remove_if(judge);
  13. list<int>::iterator it;
  14. for(it = l1.begin(); it != l1.end(); it++)
  15. {
  16. cout << *it << " ";//2 4 6
  17. }
  18. return 0;
  19. }

erase()删除一个或者几个元素

clear()清除所有的元素

insert(pos, n, elem), insert(pos, elem)注意:这一个插入是瞬间完成的。

insert(pos, 迭代器开始, 迭代器结束)

由于STL中的某些算法处理的是顺序容器的,所以在list中额外提供了一些功能。

  1. #include <list>
  2. #include <iostream>
  3. using namespace std;
  4. list<int>::iterator it;
  5. int main()
  6. {
  7. list<int> l1({1, 3, 5, 7, 9, 11});
  8. list<int> l2({2, 4, 6, 8, 10, 11});
  9. l1.merge(l2);//************************************
  10. for(it = l1.begin(); it != l1.end(); it++)
  11. {
  12. cout << *it << " ";
  13. }
  14. puts("");
  15. l1.reverse();//************************************
  16. for(it = l1.begin(); it != l1.end(); it++)
  17. {
  18. cout << *it << " ";
  19. }
  20. puts("");
  21. l1.sort();//************************************
  22. for(it = l1.begin(); it != l1.end(); it++)
  23. {
  24. cout << *it << " ";
  25. }
  26. puts("");
  27. l1.unique();//************************************
  28. for(it = l1.begin(); it != l1.end(); it++)
  29. {
  30. cout << *it << " ";
  31. }
  32. puts("");
  33. return 0;
  34. }

关联容器

set/multiset

set:集合容器

multiset:多重集合容器

元素值就是关键字

优点

  1. 默认进行了排序。
  2. 可以快速插入,删除,查询(全部是logN)。
  3. 支持集合的交,差,并

成员函数

empty()

size()

insert()

erase()查找元素并且删除(返回值为删除了的元素的个数(在multiset中可能大于1))

clear()

count返回关键字出现的次数

find()如果存在,返回迭代器,否则返回end()

upper_bound()第一个大于num的数字

lower_bound()第一个大于或等于num的数字

begin(), end(), rbegin(), rend()

集合的交集,并集,差集

  1. #include <list>
  2. #include <iostream>
  3. #include <set>
  4. #include <algorithm>
  5. using namespace std;
  6. list<int>::iterator it;
  7. int main()
  8. {
  9. set<int> s1({1, 2, 3, 4, 5, 6, 7, 8});
  10. set<int> s2({5, 6, 7, 8, 9, 10});
  11. vector<int> ret;
  12. //一定要设置大小!
  13. ret.resize(max(s1.size(), s2.size()));
  14. vector<int>::iterator tmp = set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), ret.begin());
  15. ret.resize(tmp - ret.begin());
  16. //重新设置大小
  17. for(vector<int>::iterator it = ret.begin(); it != ret.end(); it++)
  18. {
  19. cout << *it << " ";
  20. }
  21. return 0;
  22. }
  1. set_intersection //求两个容器的交集
  2. set_union //求两个容器的并集
  3. set_difference //求两个容器的差集

map/multimap

注意:map/multimap中的元素是以pair<>进行存储的。

map/multimap的区别

map的key不允许重复,可以使用[]

multimap的key允许重复,不可以使用[]

主要的成员函数

empty()

size()

XX[key]

  • 如果存在key,那么就可以进行引用以及赋值;
  • 但是如果不存在key,那么就会新创建一个key然后插入。

insert(make_pair() 或者 {__, __})

erase()

  1. multimap<int, int> mp;
  2. mp.insert({1, 2});
  3. mp.insert({1, 3});
  4. mp.insert({1, 4});
  5. int ret = mp.erase(1);
  6. cout << ret;

当然里面也可以是迭代器!

clear()

count()返回指定关键字的数量

find()查找关键字(如果是Multimap,那么就会返回第一个关键字)

tip:利用find和count就可以找到multimap中的所有的key值元素

哈希容器:

unorder_map/multimap、unorder_set/multiset

基本的使用与上面的是相同的

  • 但是就是没有排序也不能进行集合的运算。
  • 会占用较大的空间
  • 访问的速度也将大大提升

适配器容器

概述

一般情况下,

stack:deque(常规),list,vector

queue:deque(常规),list

priority_queue:vector(常规),deque

手动指定:

  1. stack<int, deque<int> >s;//默认
  2. stack<int, list<int> >s;
  3. stack<int, vector<int> >s;
  4. queue<int, deque<int> >q;//默认
  5. queue<int, list<int> >q;
  6. priority_queue<int, vector<int> >q;//默认
  7. priority_queue<int, deque<int> >q;

stack

具有

empty()

size()

push

pop

top

queue

具有

empty()

size()

push

pop

front

back

priority_queue

empty()

size()

push

pop

top


关系函数对象

头文件:#include<functional>

greater<>

less<>

相关练习

分隔单词

输入一堆单词,分割单词(没有标点符号)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. void Divide(const string &str, vector<string> &vec)
  4. {
  5. int i, j;
  6. i = 0;
  7. j = str.find(" ");
  8. while(j != -1)
  9. {
  10. vec.push_back(str.substr(i, j-i));
  11. i = j+1;
  12. j = str.find(" ", i);
  13. }
  14. if(i < str.length())
  15. {
  16. vec.push_back(str.substr(i));
  17. }
  18. }
  19. int main()
  20. {
  21. char buf[100];
  22. fgets(buf, 100, stdin);
  23. string str = string(buf);
  24. str.erase(str.find("\n"));
  25. vector<string> vec;
  26. Divide(str, vec);
  27. for(int i = 0; i < vec.size(); i++)
  28. cout << vec[i] << "\n";
  29. return 0;
  30. }

STL再回顾(非常见知识点)的更多相关文章

  1. mysql常见知识点总结

    mysql常见知识点总结 参考: http://www.cnblogs.com/hongfei/archive/2012/10/20/2732516.html https://www.cnblogs. ...

  2. T100 GR 报表常见知识点 (含套版制作)

    轉載至赫非域 > T100 GR 报表常见知识点 前端操作 bron1984 7小时前 5浏览 0评论 8.9.1 注意事项 字体: 如果字型没选对,会造成没设对字型的数据汇出 PDF 格式乱掉 ...

  3. Java 基础常见知识点&面试题总结(下),2022 最新版!

    你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,同步一下最新更新,希望能够帮助你. 前两篇: Java 基础常见知识点&面试题总结(上),2022 最新版 ...

  4. MySQL 锁常见知识点&面试题总结

    节选自 <MySQL 常见知识点&面试题总结> 表级锁和行级锁了解吗?有什么区别? MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发 ...

  5. CompTIA Security+ 常见知识点

    前言: Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA: 是和CISSP.CISA等共同包含在内的国际IT业热门认证之一,和CISSP偏重信息安全管理相比, ...

  6. Java 基础常见知识点&面试题总结(中),2022 最新版!| JavaGuide

    你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你. 上篇:Java 基础常见知识点&面试题总结(上),2022 最新 ...

  7. Java 集合常见知识点&面试题总结(上),2022 最新版!

    你好,我是 Guide.秋招即将到来(提前批已经开始),我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你. 你也可以在网站(javaguide.cn)上在线阅读, ...

  8. iOS 常见知识点(三):Lock

    iOS 常见知识点(一):Runtime iOS 常见知识点(二):RunLoop 锁是最常用的同步工具.一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单 ...

  9. HTML+CSS+js常见知识点

    一.HTML.CSS常见知识点 1.垂直居中盒子 /* 方法一 */ html, body { width: 100%; height: 100%; padding: 0; margin: 0; } ...

随机推荐

  1. Linux 文件权限相关知识

    文件权限说明 Linux中的文件能否被访问和工具(程序)无关,和访问的用户身份有关(谁去运行这个程序) 进程的发起者(谁去运行这个程序). 进程的发起者若是文件的所有者: 拥有文件的属主权限 进程的发 ...

  2. 端口被占用的问题解决 Web server failed to start. Port ×× was already in use

    出现此问题是端口被占用了,只需要关闭正在使用的端口就行 解决思路: 1.在服务器中更改port端口号,改为不冲突,没有被占用的端口. 2.找出被占用的端口,结束被占用的端口 解决结束被占用的端口的方法 ...

  3. 链表设计与Java实现,手写LinkedList这也太清楚了吧!!!

    链表设计与实现 在谈链表之前,我们先谈谈我们平常编程会遇到的很常见的一个问题.如果在编程的时候,某个变量在后续编程中仍需使用,我们可以用一个局部变量来保存该值,除此之外一个更加常用的方法就是使用容器了 ...

  4. 虚拟机启动时报’A start job is running for /etc/rc.local .. Compatibility错误。

    虚拟机启动时报'A start job is running for /etc/rc.local .. Compatibility错误. 问题已经存在很长时间了,但是不影响ssh登录,遂置之未理. 经 ...

  5. 服务器宕机了,Kafka 消息会丢失吗?

    大家好,我是树哥. 消息队列可谓是高并发下的必备中间件了,而 Kafka 作为其中的佼佼者,经常被我们使用到各种各样的场景下.随着 Kafka 而来得,还有三个问题:消息丢失.消息重复.消息顺序.今天 ...

  6. 【docker专栏6】详解docker容器状态转换管理命令

    docker容器有三种状态运行.停止.暂停,镜像可以创建.运行容器,镜像和容器也可以转换成tar压缩包进行存储.本文为大家介绍容器的状态转换命令及镜像创建运行容器.tar包导入导出相关的命令及使用场景 ...

  7. 如何用车辆历史违章查询API接口进行快速开发

    最近公司项目有一个车辆的历史违章查询显示的小功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的车辆历史违章查询API非常符合我的开 ...

  8. Solution -「简单 DP」zxy 讲课记实

    魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...

  9. lombok的常用注解

    出处: https://blog.csdn.net/sunnyzyq/article/details/119992746 1. @Accessors 源码 我们打开 @Accessors 的源码可以看 ...

  10. 开源MyBatisGenerator组件源码分析

    开源MyBatisGenerator组件源码分析 看源码前,先了解Generator能做什么? MyBatisGenerator是用来生成mybatis的Mapper接口和xml文件的工具,提供多种启 ...