一、向量(续)
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. json具体解释

    <span style="font-size:12px;">function testJson() { var jsonData = { "firstName ...

  2. [置顶] ※数据结构※→☆非线性结构(tree)☆============树结点 链式存储结构(tree node list)(十四)

    结点: 包括一个数据元素及若干个指向其它子树的分支:例如,A,B,C,D等. 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点. 在C语言 ...

  3. description方法介绍及重写

  4. Linux(CentOS)安装配置zeromq、jzmq(解决各种问题)

    今天为Hadoop配置zeromq.jzmq遇到各种问题,先是编译出错,到编译成功后测试出错等等,下面将我遇到的问题与大家分享一下. 第一个注意点是:必须先编译安装zeromq,然后在编译jzmq,否 ...

  5. 20160125--Spring

    package com.hanqi; import java.util.*; import com.hanqi.User; public class HelloWorld { public Hello ...

  6. QF——iOS中数据持久化的几种方式

    数据持久化的几种方式: 一.属性列表文件: .plist文件是种XML文件.数组,字典都可以和它互相转换.数组和字典可以写入本地变成plist文件.也可以读取本地plist文件,生成数组或字典. 读取 ...

  7. PHP中mktime() 函数对于日期运算和验证

    mktime() 函数对于日期运算和验证非常有用.它可以自动校正越界的输入: // 语法:mktime(hour,minute,second,month,day,year) echo(date('Y- ...

  8. 对原生js的一些小尝试

    意图仿造JQ操作以及弄个个人工具箱,不断完善中,代码均为个人摸索,所以肯定会有不少不足的地方,希望读者们能提出来. var xzhUtils = { //-----DOM对象添加类----- //-- ...

  9. 点语法、property、self注意

    1.点语法(找出不合理的地方)#import <Foundation/Foundation.h>@interface Person : NSObject{    int _age;}- ( ...

  10. 函数指针 如:void (*oper)(ChainBinTreee *p)

    在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用 ...