*容器 (1)顺序容器 vector[顺序表直接访问] depue[前后直接访问] list[双向链表]

vector 检索(用operator[ ])速度快

  1. .push_back 在数组的最后添加一个数据
  2. .pop_back 去掉数组的最后一个数据
  3. .at 得到编号位置的数据
  4. .begin 得到数组头的指针
  5. .end 得到数组的最后一个单元+1的指针
  6. front 得到数组头的引用
  7. .back 得到数组的最后一个单元的引用
  8. .max_size 得到vector最大可以是多大
  9. .capacity 当前vector分配的大小
  10. .size 当前使用数据的大小
  11. .resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
  12. .reserve 改变当前vecotr所分配空间的大小
  13. .erase 删除指针指向的数据项
  14. .clear 清空当前的vector
  15. .rbegin vector反转后的开始指针返回(其实就是原来的end-)
  16. .rend vector反转构的结束指针返回(其实就是原来的begin-)
  17. .empty 判断vector是否为空
  18. .swap 与另一个vector交换数据

deque 检索效率没vector高 两端插入和list一样

  1. 析构函数:
  2.  
  3. c.~ deque<Elem>() ;销毁所有元素,并释放内存。
  4.  
  5. 非变动性操作
  6.  
  7. c.size(); //返回当前的元素数量
  8.  
  9. c.empty(); //判断大小是否为零。等同于c.size() == 0,但可能更快
  10.  
  11. c.max_size(); //可容纳元素的最大数量
  12.  
  13. c.at(idx) ; //返回索引为idx所标示的元素。如果idx越界,抛出out_of_range
  14.  
  15. c[idx] ; //返回索引idx所标示的元素。不进行范围检查
  16.  
  17. c.front() ; //返回第一个元素,不检查元素是否存在
  18.  
  19. c.back(); //返回最后一个元素
  20.  
  21. c.begin(); //返回一个随机迭代器,指向第一个元素
  22.  
  23. c.end(); //返回一个随机迭代器,指向最后元素的下一位置
  24.  
  25. 变动性操作:
  26.  
  27. c1 = c2 ; //将c2的所有元素赋值给c1;
  28.  
  29. c.assign(n , elem); //将n个elem副本赋值给c
  30.  
  31. c.assing(beg , end); //将区间[beg;end]中的元素赋值给c;
  32.  
  33. c.push_back(elem); //在尾部添加元素elem
  34.  
  35. c.pop_back() ; //移除最后一个元素(但不回传)
  36.  
  37. c.push_front() ; //在头部添加元素elem
  38.  
  39. c.pop_front() ; //移除头部一个元素(但不回传)
  40.  
  41. c.erase(pos) ; //移除pos位置上的元素,返回一元素位置
  42.  
  43. //如 c.erase( c.begin() + 5) //移除第五个元素
  44.  
  45. c.insert(pos , elem); //在pos位置插入一个元素elem,并返回新元素的位置
  46.  
  47. c.insert(pos , n , elem); //在pos位置插入n个元素elem,无返回值
  48.  
  49. c.insert(pos , beg , end);
  50.  
  51. c.resize(num); //将容器大小改为num。可更大或更小。
  52.  
  53. c.resize(num , elem); //将容器大小改为num,新增元素都为 elem
  54.  
  55. c.clear(); //移除所有元素,将容器清空

list 插入,删除元素效率高 只支持遍历 检索排序效率低

  1. 成员函数
  2. c.begin() 返回指向链表第一个元素的迭代器。
  3. c.end() 返回指向链表最后一个元素之后的迭代器。
  4. c.front() 返回链表c的第一个元素。
  5. c.back() 返回链表c的最后一个元素。
  6. c.empty() 判断链表是否为空。
  7. c.size() 返回链表c中实际元素的个数。
  8. c.max_size() 返回链表c可能容纳的最大元素数量。
  9. c.clear() 清除链表c中的所有元素。
  10. c.rbegin() 返回逆向链表的第一个元素,即c链表的最后一个数据。
  11. c.rend() 返回逆向链表的最后一个元素的下一个位置,即c链表的第一个数据再往前的位置。
  12. c.assign(n,num) nnum拷贝赋值给链表c
  13. c.assign(beg,end) 将[beg,end)区间的元素拷贝赋值给链表c
  14. c.insert(pos,num) pos位置插入元素num
  15. c.insert(pos,n,num) pos位置插入n个元素num
  16. c.insert(pos,beg,end) pos位置插入区间为[beg,end)的元素。
  17. c.erase(pos)    删除pos位置的元素。
  18. c.push_back(num) 在末尾增加一个元素。
  19. c.pop_back() 删除末尾的元素。
  20. c.push_front(num) 在开始位置增加一个元素。
  21. c.pop_front() 删除第一个元素。
  22. c1.swap(c2); c1c2交换。
  23. swap(c1,c2); 同上。
  24. c.sort() 将链表排序,默认升序
  25. c.sort(comp) 自定义回调函数实现自定义排序
  26.  
  27. http://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html

(2)关联容器 set[快查无重复] multiset[快查有重复] map[一对一映射无重] multimap[一对一映射有重]

set(默认排序)

  1. 平衡二叉检索树使用中序遍历算法,检索效率高于vectordequelist等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
  2. 构造set集合主要目的是为了快速检索,不可直接去修改键值。
  3.  
  4. 常用操作:
  5. .元素插入:insert()
  6. .中序遍历:类似vector遍历(用迭代器)
  7. .反向遍历:利用反向迭代器reverse_iterator
  8. 例:
  9. set<int> s;
  10. ......
  11. set<int>::reverse_iterator rit;
  12. for(rit=s.rbegin();rit!=s.rend();rit++)
  13. .元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。
  14. set<int> s;
  15. s.erase(); //删除键值为2的元素
  16. s.clear();
  17. .元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
  18. set<int> s;
  19. set<int>::iterator it;
  20. it=s.find(); //查找键值为5的元素
  21. if(it!=s.end()) //找到
  22. cout<<*it<<endl;
  23. else //未找到
  24. cout<<"未找到";
  25. .自定义比较函数
  26. ()元素不是结构体:
  27. 例:
  28. //自定义比较函数myComp,重载“()”操作符
  29. struct myComp
  30. {
  31. bool operator()(const your_type &a,const your_type &b)
  32. [
  33. return a.data-b.data>;
  34. }
  35. }
  36. set<int,myComp>s;
  37. ......
  38. set<int,myComp>::iterator it;
  39. ()如果元素是结构体,可以直接将比较函数写在结构体内。
  40. 例:
  41. struct Info
  42. {
  43. string name;
  44. float score;
  45. //重载“<”操作符,自定义排序规则
  46. bool operator < (const Info &a) const
  47. {
  48. //按score从大到小排列
  49. return a.score<score;
  50. }
  51. }
  52. set<Info> s;
  53. ......
  54. set<Info>::iterator it

begin()        ,返回set容器的第一个元素

end()      ,返回set容器的最后一个元素

clear()          ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

map

  1. begin() 返回指向map头部的迭代器
  2. clear() 删除所有元素
  3. count() 返回指定元素出现的次数
  4. empty() 如果map为空则返回true
  5. end() 返回指向map末尾的迭代器
  6. equal_range() 返回特殊条目的迭代器对
  7. erase() 删除一个元素
  8. find() 查找一个元素
  9. get_allocator() 返回map的配置器
  10. insert() 插入元素
  11. key_comp() 返回比较元素key的函数
  12. lower_bound() 返回键值>=给定元素的第一个位置
  13. max_size() 返回可以容纳的最大元素个数
  14. rbegin() 返回一个指向map尾部的逆向迭代器
  15. rend() 返回一个指向map头部的逆向迭代器
  16. size() 返回map中元素的个数
  17. swap() 交换两个map
  18. upper_bound() 返回键值>给定元素的第一个位置
  19. value_comp() 返回比较元素value的函数

(3)容器适配器 stack[LIFO] queue[FIFO] priority_queue[优先级高的出]

stack

  1. stack
  2. stack 模板类的定义在<stack>头文件中。
  3. stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要
  4. 的,在不指定容器类型时,默认的容器类型为deque
  5. 定义stack 对象的示例代码如下:
  6. stack<int> s1;
  7. stack<string> s2;
  8. stack 的基本操作有:
  9. 入栈,如例:s.push(x);
  10. 出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
  11. 访问栈顶,如例:s.top()
  12. 判断栈空,如例:s.empty(),当栈空时,返回true
  13. 访问栈中的元素个数,如例:s.size()。
  14.  
  15. empty() 堆栈为空则返回真
  16.  
  17. pop() 移除栈顶元素(不会返回栈顶元素的值)
  18.  
  19. push() 在栈顶增加元素
  20.  
  21. size() 返回栈中元素数目
  22.  
  23. top() 返回栈顶元素
  24.  
  25. emplace ()
  26.  
  27. swap()

queue

  成员函数

  • empty()判断队列空,当队列空时,返回true。
  • size()访问队列中的元素个数。
  • push()会将一个元素置入queue中。
  • front()会返回queue内的第一个元素(也就是第一个被置入的元素)。
  • back()会返回queue中最后一个元素(也就是最后被插入的元素)。
  • pop()会从queue中移除一个元素。[1] 
  1. (constructor)Construct queue (public member function )
  2. emptyTest whether container is empty (public member function )
  3. sizeReturn size (public member function )
  4. frontAccess next element (public member function )
  5. backAccess last element (public member function )
  6. pushInsert element (public member function )
  7. emplace Construct and insert element (public member function )
  8. popRemove next element (public member function )
  9. swap Swap contents (public member function )

priority_queue

  1. (constructor)Construct priority queue (public member function )
  2. emptyTest whether container is empty (public member function )
  3. sizeReturn size (public member function )
  4. topAccess top element (public member function )
  5. pushInsert element (public member function )
  6. emplace Construct and insert element (public member function )
  7. popRemove top element (public member function )
  8. swap Swap contents (public member function )

下面是选择顺序容器类型的一些准则  0.vector 不自动排序但允许重复 list也是 set有不重复元素的特性,但其自动排序

1.如果我们需要随机访问一个容器则vector要比list好得多 。

2.如果我们已知要存储元素的个数则vector 又是一个比list好的选择。

3.如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好

4.除非我们需要在容器首部插入和删除元素否则vector要比deque好。

5.如果只在容易的首部和尾部插入数据元素,则选择deque.

6.如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新拍学,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中

一.string

输出用法见代码。

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string one("DZY is stupid!");
  7. cout<<one<<endl;
  8. string two(,'o');
  9. cout<<two<<endl;
  10. string three(one);
  11. cout<<three<<endl;
  12. one+=" Oops!";
  13. cout<<one<<endl;
  14. two="Sorry! That was ";
  15. three[]='P';
  16. string four=two+three;
  17. cout<<four<<endl;
  18. char alls[]="All's well that ends well";
  19. string five(alls,);
  20. cout<<five<<endl;
  21. string six(alls+,alls+);
  22. cout<<six<<',';
  23. string seven(&five[],&five[]);
  24. cout<<seven<<"..."<<endl;
  25. string eight(four,,);
  26. cout<<eight<<"in motion!"<<endl;
  27. return ;
  28. }

输入用法:

  1. string stuff;
  2. cin>>stuff;
  3. getline(cin,stuff);
  4. getline(stuff,':'); //终止条件
  5. operator>>(cin,stuff);
  6. #include <iostream>
  7. #include <fstream> //文件操作
  8. #include <string>
  9. #include <cstdlib>
  10. int main()
  11. {
  12. using namespace std;
  13. ifstream fin; //文件
  14. fin.open("tobuy.txt");//打开
  15. if (fin.is_open() == false)//判断是否打开
  16. {
  17. cerr << "Can't open file. Bye.\n";
  18. exit(EXIT_FAILURE);
  19. }
  20. string item;
  21. int count = ;
  22.  
  23. getline(fin, item, ':'); //文件操作需要注意输入方式,终止条件
  24. while (fin) // while input is good
  25. {
  26. ++count;
  27. cout << count <<": " << item << endl;
  28. getline(fin, item,':');//文件操作需要注意输入方式,终止条件
  29. }
  30. cout << "Done\n";
  31. fin.close(); //关闭文件
  32. // std::cin.get();
  33. // std::cin.get();
  34. return ;
  35. }

tobuy.txt

  1. sardines:chocolate ice cream:pop corn:leeks:
  2. cottage cheese:olive oil:butter:tofu:

string---find用法

  1. find(const string&str ,size_type pos=)const pos开始找否则返回string::nops
  2. find(const char*s ,size_type pos=)const s开始找否则返回string::nops
  3. find(const char*s ,size_type pos= ,size_type n)const pos开始,查找s的前n个字符,否则返回string::nops
  4. find(char ch ,size_type pos=)const pos开始找字符ch找到返回首次出现位置,否则返回string::nops
  5. rfind() 最后一次出现位置
  6. find_firse_of() 找首次出现位置
  7. find_last_of() 最后一次出现位置
  8. find_firse_not_of() 找第一个不包含在已知参数中的字符
  9. find_last_not_of() 找最后一个不包含在已知参数中的字符

举例

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. string s = "helllo";
  9. if (s.find("e") == string::npos) //yes
  10. cout << "no" << endl;
  11. else
  12. cout << "yes" << endl;
  13.  
  14. if (s.find("z") == string::npos) //no
  15. cout << "no" << endl;
  16. else
  17. cout << "yes" << endl;
  18. }

二.lower_bound();upper_bound()

lower_bound(a,a+n,k)在已排好序的a中利用二分法找出ai>=k的最小指针(返回值);upper_bound(a,a+n,k).......ai<=k;两个联合起来就是找k;

STL库函数 持续更新的更多相关文章

  1. STL 一些常用的STL函数(持续更新

    先说一下  一边要用到算法的东西一般要加#include<algorithm>头文件 一.栈和队列 1 栈 :一种线性表 特点  后进先出 头文件  #include<stack&g ...

  2. C++入职学习篇--代码规范(持续更新)

    C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...

  3. 值得学习的C/C++开源项目 持续更新

    值得学习的C语言开源项目 持续更新 文章目录 值得学习的C语言开源项目 持续更新 - 1. Webbench - 2. Tinyhttpd - 3. cJSON - 4. CMockery - 5. ...

  4. 2020年腾讯实习生C++面试题&持续更新中(3)

    2020年腾讯实习生C++面试题&持续更新中(3) hello,大家好,我是好好学习,天天编程的天天. 来给大家大家分享腾讯实习生面经了. 天天希望大家看到面经后一定要做充分的准备,结合自己掌 ...

  5. 2020年腾讯实习生C++面试题&持续更新中(1)

    2020年腾讯实习生C++面试题&持续更新中(1) 腾讯面试整理(1) 最近大三的学生找实习生的同学非常多,给大家分享一篇腾讯实习生的面试题,关于面试题,会持续更新~~~ 也算是今天开通博客的 ...

  6. 2020年腾讯实习生C++面试题&持续更新中(5)

    2020年腾讯实习生C++面试题&持续更新中(5) 大家好呀,我是好好学习天天编程的天天~ 昨天一位小伙伴反馈已经拿到了腾讯offer,很是替小伙伴的激动~ 那今天还是持续给大家分享面经,希望 ...

  7. 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新

    微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...

  8. iOS系列教程 目录 (持续更新...)

      前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...

  9. ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)

    前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...

随机推荐

  1. [codevs 1306]广播操的游戏(Trie)

    题目:http://codevs.cn/problem/1306/ 分析:题意一看就知道就是要求Trie有多少个节点.但是如果每次单独取原串的所有子串加入Trie会超时,为什么呢?比方说AAABBBC ...

  2. 每天一个linux命令(36):top命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是 一个动态显示过程,即可以通过用户按键来不断刷 ...

  3. HDU 5113 Black And White 回溯+剪枝

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...

  4. Xamarin.Forms——WebView技术研究

    在Xamarin中有一些Forms原生不太好实现的内容可以考虑使用HTML.Javascript.CSS那一套前端技术来实现,使用WebView来承载显示本地或网络上的HTML文件.不像OpenUri ...

  5. SPOJ QTREE 树链剖分

    树链剖分的第一题,易懂,注意这里是边. #include<queue> #include<stack> #include<cmath> #include<cs ...

  6. BZOJ-1143&&BZOJ-2718 祭祀river&&毕业旅行 最长反链(Floyed传递闭包+二分图匹配)

    蛋蛋安利的双倍经验题 1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1901 Solved: 951 ...

  7. POJ1141 Brackets Sequence

    Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...

  8. 以一个权限系统来告别WebForm —(一)项目整休架构设计与数据库设计

    在本节我想与大家与分享一下,我所将要做的权限系统的架构和数据库的表的设计.请各位大神们对我项目中设计的不足之处进行指导,让我得以更好的写完它,留给需要它的人. 我的项目架构如下图所示: 如上图所示,在 ...

  9. HDU 1060 Left-most Digit

    传送门 Leftmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. Maven学习笔记-01-Maven入门

    一 Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1  项 ...