C++容器
来源:互联网 发布:python老男孩10期网盘 编辑:程序博客网 时间:2024/05/29 02:40
一、顺序容器
vector、deque、list、forward_list、array、string
vector:连续内存空间存储,快速随机访问;尾部插入,中间插入/删除耗费时间
string:连续内存空间存储,快速随机访问;尾部插入,中间插入/删除耗费时间deque:随机访问;两端插入/删除
list:不连续,不支持随机访问,任意插入/删除
forward_list:不支持size()
array:大小不变 array<int,42> a;必须指定容器大小42
容器操作
添加元素:push_back enplace_back()除forward_list和array push_front() emplace()除vector和string
forward-list操作
string操作
string与数值之间的转换:to_string(val) stoi() stol() stoul() stoll() stoull() stof() stod() stold()
模式匹配
赫夫曼编码
转义字符
函数/方法/实现
vector
成员函数:push_back() size() erase() insert() emplace() unique() swap() merge() remove() reverse()
非成员函数:for_each() sort() copy() random_shufflr() transform() find()
string
成员函数:size() length() find() append() repalce()
非成员函数:#include <numeric>
二、关联容器
三、STL函数(泛型算法)
algorithm和numeric数值泛型算法
只读算法
写操作算法
拷贝算法
重排元素算法
sort()
reverse()
定制操作
四、各容器的底层原理
STL共有六大组件
1、容器 2、算法 3、迭代器 4、仿函数 6、适配器
STL容器的实现原理
STL来管理数据十分方便,省去了我们自己构建数据结构的时间.其实,STL的实现也是基于我们常见的数据结构.
序列式容器:
vector-数组,元素不够时再重新分配内存,拷贝原来数组的元素到新分配的数组中。
list-双链表。
deque-分配中央控制器map(并非map容器),map记录着一系列的固定长度的数组的地址.记住这个map仅仅保存的是数组的地址,真正的数据在数组中存放着.deque先从map中央的位置(因为双向队列,前后都可以插入元素)找到一个数组地址,向该数组中放入数据,数组不够时继续在map中找空闲的数组来存数据。当map也不够时重新分配内存当作新的map,把原来map中的内容copy的新map中。所以使用deque的复杂度要大于vector,尽量使用vector。
stack-基于deque。
queue-基于deque。
heap-完全二叉树,使用最大堆排序,以数组(vector)的形式存放。
priority_queue-基于heap。
slist-单向链表。
关联式容器:
set,map,multiset,multimap-基于红黑树(RB-tree),一种加上了额外平衡条件的二叉搜索树。
hash table-散列表。将待存数据的key经过映射函数变成一个数组(一般是vector)的索引,例如:数据的key%数组的大小=数组的索引(一般文本通过算法也可以转换为数字),然后将数据当作此索引的数组元素。有些数据的key经过算法的转换可能是同一个数组的索引值(碰撞问题,可以用线性探测,二次探测来解决),STL是用开链的方法来解决的,每一个数组的元素维护一个list,他把相同索引值的数据存入一个list,这样当list比较短时执行删除,插入,搜索等算法比较快。
hash_map,hash_set,hash_multiset,hash_multimap-基于hash table。
1.堆、优先级队列
//堆插入元素void MinHeapFixup(int a[],int i){int j=(i-1)/2;int temp=a[i];while(j>=0 &&i!=0){if(a[j]<=a[i])break;a[i]=a[j];i=j;j=(j-1)/2;}a[i]=temp;}//堆删除元素void MinHeapFixdown(int a[],int i,int n){int j=2*i+1;int temp=a[i];while (j<=n-1){if(a[j]>=a[i])break;if(a[j+1]<a[i])j++;a[i]=a[j];i=j;j=2*j+1;}a[i]=temp;}//初始化堆,从(n-1-1)/2开始执行堆元素下沉操作void init(int a[]){for (int i=strlen(a)/2-1;i>=0;i--){MinHeapFixdown(a,i,n);}}//堆排序//由最大堆、最小堆的特性,我们可以得到数根节点,即a[0]永远是最小或最大的,我们可以将a[0]和a[n-1]交换,再对a[0]到a[n-2]的堆进行堆排序,直到a[0]和a[1]交换void MinHeapsortTodescendarray(int a[],int n){for(int i=n-1;i>=1;i--){swap(a[i],a[0]);MinHeapFixdown(a,0,i);}}
2.map
3.hash(哈希表)
开放定址法
开链法
- C++--容器
- 【C/C++】STL容器
- C++STL容器
- C ++ 读书笔记 顺序容器
- C++primer 关联容器
- C++STL容器简介
- 《C++primer》 顺序容器
- 《C++primer》关联容器
- c++stack容器介绍
- c++queue容器介绍
- c++map容器介绍
- C++MAP关联容器
- C++map容器类
- C++pair容器
- c++queue容器介绍
- C++Primer 顺序容器
- c++stack容器介绍
- C++_STL 各种容器
- 51nod 1396 还是01串 -Zero
- 1053: [HAOI2007]反素数ant
- this绑定
- HTML菜鸟入门5
- 【HPU1194】Judge [快速幂]
- C++容器
- C# 字符分割与统计_递进版
- 数据库中插入数据
- 【HPU-2016校赛-B】영어
- 博弈模板(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)
- 设计模式概括
- hdu 4786 生成树~
- 欢迎使用CSDN-markdown编辑器
- 笔试题 6