一、向量(续)
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. visibleViewController和topViewController 获取当前显示的页面

    原文:http://blog.sina.com.cn/s/blog_881ed8500102vo38.html UINavigationController 中有visibleViewControll ...

  2. 关于cocos2dx 3.0升级崩溃报错(unable to load native library) 和(Fatal signal 11 (SIGSEGV) at 0x00000000)

    近期一直在Windows平台开发cocos-2dx游戏,期间做了一次引擎升级,升级到了3.0正式版本号.Windows平台上表现非常正常,没有出现什么问题. 上周五准备公布一个安卓包,编译非常轻松的就 ...

  3. 介绍Foundation框架

    开始介绍Foundation框架.OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我 ...

  4. CSS中的各种居中方法总结

    CSS中的居中可分为水平居中和垂直居中.水平居中分为行内元素居中和块状元素居中两种情况,而块状元素又分为定宽块状元素居中和不定宽块状元素居中.下面详细介绍这几种情况. 一.水平居中 1.行内元素居中 ...

  5. MyEclipse中jquery文件报错

  6. Linux 内核无线子系统

    Linux 内核无线子系统 浅谈 Linux 内核无线子系统 Table of Contents 1. 全局概览 2. 模块间接口 3. 数据路径与管理路径 4. 数据包是如何被发送? 5. 谈谈管理 ...

  7. Linux中的网络

    在windows 中表示一张网卡用本地连接1,本地连接2这种方式来表示:而在linux 中用的是etho,eth1 等等这样的东西来表示的.

  8. SQL Server 全文索引

    create table Document(ID int not null,Name nvarchar(255) not null,Body nvarchar(max) not null);go cr ...

  9. 5.java.lang.IndexOutOfBoundsException(数组下标越界异常)

    数组下标越界异常 查看调用的数组或者字符串的下标值是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中 ...

  10. __I、__O 、__IO volatile是什么?怎么用? .

    这是ST库里面的宏定义,定义如下: #define __I volatile const /*!< defines 'read only' permissions */ #define __O ...