C++ vector、stack、queue、set、map整理

一、vector

创建方式:vector<类型> 名称(大小,初值)

vector<int> vec(10, 1)   #创建一个大小为10,初值为1int数组
vector<int> vec2(vec.begin(), vec.begin()+2)    #创建一个数组,其中值为vec的前两个数据

常用方法:

vec.size();      #获取vec长度
vec.front();      #获取第一个数据
vec.back();      #获取最后一个数据
vec.empyt();      #判断vector是否为空
vec.push_back(x);      #从vector尾部插入一个数据x
vec.pop_back();      #删除vector中最后一个数据
vec.insert(vec.begin()+i, x);      #在i位置插入一个数据x
vec.insert(vec.begin()+i, n, x);      #在i位置插入n个数据x
vec.insert(vec.begin()+i, vec2+i, vec2+j);      #在i位置插入vec2的第i个数据到第j-1个数据

vector的实现机制

vector的存储方式:连续的线性存储空间,利用指针来管理存储空间大小和使用情况。

当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间。vector的空间动态增加大小,并不是在原空间之后的相邻地址增加新空间,因为vector的空间是线性连续分配的,不能保证原空间之后有可供配置的空间。

vector和array的对比:vector能实现数组的自动扩容,内存运用更加合理且灵活。vector维护的是一个连续的线性空间,支持随机访问。

二、stack

创建方式:stack<类型> 名称
常用方法:

stack<int> st;
st.size();      #获取栈的高度
st.empty();      #判断栈是否为空
st.top();      #获取栈顶元素
st.pop();      #弹出栈顶元素
st.push(x);      #把x压入栈中

栈的实现机制

栈是一种先进后出的数据结构,通过修饰deque(双向队列)的接口来实现的,其不能被遍历,只能访问栈顶元素。

在C++程序中存储方式 栈与堆的区别:

  1. 栈存放函数的参数值、局部变量,由编译器自动分配释放;堆是由new分配的内存块,由应用程序控制,需要程序员手动利用delete释放。
  2. 堆容易造成内存空间的不连续,会有大量的碎片(因new和delete的频繁操作导致)
  3. 堆的生长空间向上,地址越大(即地址从小到大分配);栈的生长空间向下,地址越小(即地址从大到小分配)

三、queue

创建方式:queue<类型> 名称
常用方法:

queue<int> qt;
qt.size();      #获取队列长度
qt.empty();      #判断队列是否为空
qt.front();      #获取队首元素
qt.back();      #获取队尾元素
qt.pop();      #出队
qt.push(x);      #元素x入队

队列的实现机制

队列是一种先进先出的数据结构,通过修饰deque(双向队列)的接口来实现,其不能被遍历,能访问队首和队尾的元素。

四、set

创建方式:set<类型> 名称 或 unordered_set<类型> 名称
常用方法:

set<int> st;   # unordered_set<int> ust;
st.begin();     #获取set中的第一个元素
st.end();      #获取set中的最后一个元素
st.clear();      #删除set中的所有元素
st.empty();      #判断set是否为空
st.size();      #获取set的元素个数
st.insert(x);      #在set中插入元素x
st.count(x);      #统计set中元素x的个数(由于set的元素是唯一的,所以结果一般为0或者1)
st.erase(x);      #在set中删除元素x

set的实现机制

set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序(也可以定义为unordered_set)。set中数元素的值不能直接被改变。
set的实现是采用一种非常高效的平衡检索二叉树:红黑树(RB树),其性能要高于一般的平衡二叉树。

五、map

创建方式:map<键的类型,值得类型> 名称
常用方法:

map<int, string> mp;
mp[0] = "lzs";      #如果不存在键0,则创建键0并赋值为“lzs”;如果存在键0,则赋值为“lzs”;和insert函数区分,可自行查找
mp.size();      #获取map的数据量
# 查找和删除都要用迭代器来对迭代位置进行操作
map<int, string>::iterator iter;  
iter = mp.find(0);      #查找键为0的键值对位置
map.erase(iter);      #删除该位置元素
iter->first;      #获取该位置的键
iter->second;      #获取该位置的值
# map的遍历方式
for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
for(int nindex = 1; nindex <= mp.size(); nindex++)  

map的实现机制

Map是STL的一个关联容器,它提供一对一(键值对)的数据处理能力。
map的实现是采用一种非常高效的平衡检索二叉树:红黑树(RB树),其性能要高于一般的平衡二叉树。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值