一、向量(续)
1.大小和容量
大小:容器中元素的个数。
容量:容器中可容纳元素的个数。
size_type size (void) const; // 获取大小
void resize (size_type num,
value_type const& val = value_type ()); // 改变大小
往小改,被裁减掉的元素将被析构。
往大改,新增出来的元素将被构造,第二个参数表示初始值。
void clear (void); // 清空,相当于resize (0)
bool empty (void) const; // 判空
size_type capacity (void) const; // 获取容量(以元素为单位)
void reserve (size_type size); // 预留容量
向量中不适合存放过多的大对象。
class Student {
...
private:
char name[256];
char info[1024];
};
class Student {
public:
Student (...) : name (new char[256]),
info (new char[1024]) { ... }
~Student (void) {
delete[] name;
delete[] info;
}
private:
char* name;
char* info;
};
class Student {
...
private:
string name;
string info;
};
1)向量的大小可增可减,引起大小变化的函数包括:
push_back/pop_back/insert/erase/resize/clear。
2)向量的容量只增不减,直接改变容量的函数只有一个:
reserve。
3)向量大小的增加会导致其容量的增加,但向量容量的变化不会
影响其大小。
4)通过resize函数增加向量的大小,新增部分会初始化,但是通
过reserve函数增加向量的容量,新增部分不会初始化。
5)访问向量容量范围以内大小范围以外的元素,并不会引发段错
误,但其值未定义。
6)所有关于大小和容量的变化都发生在向量的尾部。
2.查找和排序
#include <algorithm>
iterator find (iterator begin, iterator end,
value_type const& val);
begin - 查找范围的起始迭代器
end - 查找范围的终止迭代器(指向最后一个参与查找的元素的
下一个位置)
val - 查找目标
成功返回容器中第一个与val相匹配的元素的迭代器,失败返回
第二个参数end。
线性查找:O(N)
void sort (iterator begin, iterator end);
在[begin, end)之间做快速排序(O(NlogN))。
用“<”比大小。
void sort (iterator begin, iterator end, less cmp);
用比较器比大小。
bool cmp (value_type const& a, value_type const& b) {
if (a < b)
return true;
else
return false;
}
class Cmp {
public:
bool operator() (value_type const& a,
value_type const& b) const {
if (a < b)
return true;
else
return false;
}
};
3.类对象的向量
1)元素类型类往往需要提供缺省构造函数和支持深拷贝语义的拷
贝构造函数以及拷贝赋值运算符函数。
2)如果需要通过find在容器中查找,元素类型需要提供对
“==”运算符的支持。
3)如果需要通过两参数版本sort对容器做排序,元素类型需要提
供对“<”运算符的支持。
4.任何时候对向量的结构性改变,都有可能使之前初始化的迭代
器失效。通过对迭代器的再次初始化总可以得到正确的结果。
二、双端队列(deque)
增加了两个成员函数:push_front/pop_front
去掉了两个成员函数:capacity/reserve
双端队列的首尾两端都有适度的开放性,因此在靠近首尾两端做插入和删除,其时间复杂度是对称的。
双端队列在总体时间复杂度和空间复杂度方面比向量略差。
四、列表(list)
1.常用成员函数
front/push_front/pop_front
back/push_back/pop_back
insert/erase
size/resize/clear/empty
begin/end/rbegin/rend
2.特殊成员函数
1)删除所有匹配元素
void remove (value_type const& val);
2)将连续重复出现的元素唯一化
void unique (void);
3)将一个列表的一部分或全部剪切到另一个列表中
void splice (iterator pos, list& lst);
将参数列表lst的全部内容剪切到调用列表的pos之前。
void splice (iterator pos, list& lst, iterator del);
将参数列表lst的del元素剪切到调用列表的pos之前。
void splice (iterator pos, list& lst, iterator begin,
iterator end);
将参数列表lst的从begin到end之间的元素剪切到调用列表的
pos之前。
4)将两个有序链表合并为一个有序链表
void merge (list& lst); // <
合并之前调用列表和参数列表必须已经有序,合并以后参数列表
中的所有元素都被剪切到调用列表中,保证调用列表依然有序。
void merge (list& lst, less cmp); // 比较器
5)排序
void sort (void); // <
void sort (less cmp); // 比较器
五、堆栈(stack)
void push (value_type const& val); // 压入
-> push_back
void pop (void); // 弹出
-> pop_back
value_type& top (void); // 栈顶
-> back
size_type size (void) const; // 大小
-> size
bool empty (void) const; // 判空
->empty
底层容器:vector/deque(缺省)/list
stack<int, vector<int> > si;
stack<string, list<string> > ls;
stack<string> ls; // stack<string, deque<string> > ls;
六、队列(queue)
void push (value_type const& val); // 压入
-> push_back
void pop (void); // 弹出
-> pop_front
value_type& front (void); // 队首
-> front
value_type const& front (void) const; // 队首
-> front
value_type& back (void); // 队尾
-> back
value_type const& back (void) const; // 队尾
-> back
size_type size (void) const; // 大小
-> size
bool empty (void) const; // 判空
->empty
底层容器:deque(缺省)/list
七、优先队列(priority_queue)
void push (value_type const& val); // 压入
void pop (void); // 弹出
value_type& top (void); // 队首
何为优?
1.缺省:以大者为优,大小关系由元素类型的“<”运算决定。
2.定制:由比较器决定优先级。
底层容器:vector/deque(缺省)
八、映射(map)
1.映射是一个key-value对的序列,其中每个key都是唯一的。
2.映射中所有的key-value对,按key的升序排列,以平衡有序
二叉树的形式存储。
3.通过key获得与之唯一对应的value很快:O(logN)。
4.基于key类型的"<"运算符或者比较器决定key的大小。
map<string, int> si;
key value
map<string, int, less> si;
比较器
5.映射支持以key为下标的“[]”运算符。如果key不存在,新建
一个节点返回其value的引用。如果key已存在,直接返回对应
的value的引用。
map<string, int> si;
si["张飞"] = 80; // 新建"张飞-80"
si["张飞"] = 50; // 修改
6.映射以pair作为基本存储单位。
pair<key, value> p;
p.first -> key
p.second -> value
7.常用成员函数
1)插入元素
pair<iterator, bool> insert (pair<key_type,
value_type> const& pair);
2)删除元素
void erase (iterator pos); // 删一个
void erase (iterator begin, iterator end); // 删一组
size_type erase (key_type const& key); // 根据key删
3)查找匹配
iterator find (key_type const& key);
如果查找成功返回指向匹配pair的迭代器,如果失败返回容器
的终止迭代器。该函数不需要key的类型支持"=="运算,key
的类型只要支持"<"运算或提供了比较器即可。
九、集合(set)
没有value的映射。
十、多重映射(multimap)
key不唯一,一个key可以同时对应多个value。
iterator lower_bound (key_type const& key); // 匹配下限
iterator upper_bound (key_type const& key); // 匹配上限
pair<iterator, iterator> equal_range (
key_type const& key); // 匹配范围
多重映射不支持"[]"运算符。
十一、多重集合(multiset)
没有value的多重映射。

STL模板_十大容器概念的更多相关文章

  1. STL模板_容器概念

    一.STL(Standard Template Library,标准模板库)概述1.容器:基于泛型的数据结构.2.算法:基于泛型的常用算法.3.迭代器:以泛型的方式访问容器中的元素,是泛型的算法可以应 ...

  2. STL模板_概念

    模板和STL一.模板的背景知识1.针对不同的类型定义不同函数版本.2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引 入风险.3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的 具体函 ...

  3. STL模板_智能指针概念

    一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...

  4. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

  5. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  6. 容器平台选型的十大模式:Docker、DC/OS、K8S 谁与当先?

    作者:刘超   来自:网易云 基础服务 无论是在社区,还是在同客户交流的过程中,总会被问到到底什么时候该用 Docker?什么时候用虚拟机?如果使用容器,应该使用哪个容器平台? 显而易见,我不会直接给 ...

  7. 容器平台选型的十大模式:Docker、DC/OS、K8S 谁与当先?【转】

    网易企业服务2017-10-13 无论是在社区,还是在同客户交流的过程中,总会被问到到底什么时候该用 Docker?什么时候用虚拟机?如果使用容器,应该使用哪个容器平台? 显而易见,我不会直接给大家一 ...

  8. 容器平台选型的十大模式:Docker、DC/OS、K8S谁与当先?

    首先我们来谈什么情况下应该使用Docker的问题   如图,左面是经常挂在嘴边的所谓容器的优势,但是虚拟机都能一一怼回去. 如果部署的是一个传统的应用,这个应用启动速度慢,进程数量少,基本不更新,那么 ...

  9. 外媒速递:十大最佳心理学概念助你提升Web设计效果

    外媒速递是核子可乐精选的近日国外媒体的精彩文章推荐,希望大家喜欢! 本期给大家推荐的是帮助你提升Web设计效果的十大最佳心理学概念.改善企业云环境协作效率的九款卓越工具.选择移动应用开发工具时要考虑的 ...

随机推荐

  1. vim简单命令教程-firstblood

    你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法. Vim the Six Billion Dollar editor Better, ...

  2. mvc+ef5+easyui实例(1)

    mvc+ef5+easyui 组织机构和员工管理实例 环境:vs2010+sql2008 框架搭建 1,新建mvc4 web应用 2. 3. 系统自动生成的的controllers,和views文件中 ...

  3. C#扩展方法的理解 (转)

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...

  4. Java语言导学笔记 Chapter 8 Thread

    8.1 什么是线程 def: 线程是程序内的一个单一的顺序控制流程 作为一个顺序的控制流程,线程必须在运行它的程序中占用一些资源.例如,线程必须有它自己的执行堆栈和程序计数器.在线程内运行的代码只在此 ...

  5. OC语法9——Category类别

    Category(分类): 当我们在开发过程中要给类添加新的方法时,一般不要去动原类. 再不改动原类的限制下,怎么拓展类的方法?以往我们的做法是新建子类使其继承该类,然后通过子类拓展类的行为. OC提 ...

  6. JQuery表格展开与内容筛选

    单击分类的时候,可以关闭打开相对应的内容.例如点击前台设计组,则只显示前台设计组的内容.再次点击则收缩. 筛选的话就是匹配输入框的内容,如果某行数据存在,则显示出来. <html> < ...

  7. ajax调用后台Java

    //html部分 <input type='text' placeholder='用户名' id="username" name="username" c ...

  8. C#access数据库操作

    比较凌乱,有时间在整理吧. Provider=Microsoft.Jet.OLEDB.!" private void GetCon() { string strConnection=&quo ...

  9. 编写一个程序实现strcpy函数的功能

    #include <stdio.h> #include <string.h> #define N 5 char *mycpy(char *s1, char *s2) { //数 ...

  10. RedMine 版本管理工具

    一.介绍: Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.它用日历和甘特图辅助项目及进度可视化显示.同时它又支持多项目管理.Redmine是一个自由开放 源码软件解决方案,它提供集 ...