一、vector
创建方式:vector<类型> 名称(大小,初值)
vector<int> vec(10, 1) #创建一个大小为10,初值为1的int数组
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++程序中存储方式 栈与堆的区别:
- 栈存放函数的参数值、局部变量,由编译器自动分配释放;堆是由new分配的内存块,由应用程序控制,需要程序员手动利用delete释放。
- 堆容易造成内存空间的不连续,会有大量的碎片(因new和delete的频繁操作导致)
- 堆的生长空间向上,地址越大(即地址从小到大分配);栈的生长空间向下,地址越小(即地址从大到小分配)
三、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树),其性能要高于一般的平衡二叉树。