一 vector
1. 定义:
1. vector<int>myVec;// 这种是定义了一种空的vector容器
//并没有初始化,其size()为0. empty()为true
2. vector<int>myVec(n,0);// 这种方式是定义了一个长度为n的容器,并且里面已经完成了初始化
// 初始化内容为0, 其size() = n; 可以直接访问myVec[0]获取里面的值
3. 二维的vector<vector<int>>myVec;// 定义了二维的vector,长度为0.empty() = true;
// 存元素通过先定义一个一维容器然后再存如:
vector<int>son(n,0); // 创建一维容器
myVec.push_back(son);// 存入二维容器中
2.常用方法
设有如下定义
vector<int>myVec;
int x;
1) push_back(x);// 存入整形变量进数组
2) myVec.size();// 获取数组长度
3) myVec.empty();// 判断数组是否为空, 返回值为bool类型
4) myVec.earse(myVec.begin() + i);// 删除容器中第i位上面的元素,后面的元素会自动向前补齐
5) myVec.insert(myVec.begin() + i);// 在容器第i位的位置处插入一个元素, 后面的元素会自动后移
3.遍历
1)for(int i = 0 ; i < myVec.size(); i++)cout << myVec[0] << endl;
2)for(auto x : myVec)cout << x << endl;
3)for(auto x = myVec.begin(); x != myVec.end(); x++)cout << (*x);//这种方式是通过迭代器遍历,我不常用
4.底层实现
vector是通过数组实现的, 因为数组的特点是一片连续的内存空间,所以可以直接用下角标来访问,和java的arrayList感觉有点像,内部是一个数组,然后有一个是数组中存放实际元素个数,有一个是数组的实际长度, 在插入元素时首先判断插入这个元素所需要的内存是否已经超出了数组的实际长度,超出之后就对数组进行扩容,一般是*1.5(Gcc) 或者是*2(VS2015) .至于为什么2倍扩容有两个原因,1多次扩容后可以内存复用提高空间的利用率,2.经过多次push_back均摊下来时间复杂度大约是O(1)的.
二 unordered_map
未完待续
三 queue(队列)http://www.cplusplus.com/reference/queue/queue/back/
说明 : 队列是一种先进先出的容器,相当于一个宽度仅为一个车身的山洞一样,先进去的车子先出山洞.
// 定义queue
queue<int>myQue; // 定义了一个空的队列
// 常用方法:
{
// 1
myQue.pop();// 将栈顶元素删除, 注意这个是没有返回值的,所以不能通过这个获取队列头数据
// 小例子
while(!myQue.empty())
{
myQue.pop();// 弹出队列
}
// 2
myQue.front();// 获取队列头部元素,这个是有返回值的,返回的是栈顶元素,
//相当于栈顶元素的引用,可以直接修改
// 小例子
int topVal = myQue.front();// 获取队列顶部元素的值
myQue.front() = 15; // 修改队列顶部的值
// 3
myQue.push(val);// 将数据压入队列
// 小例子
myQue.push(15);// 将15压入队列,放到队列尾部,相当于刚进山洞
// 4
myQue.back(val);// 获取
// 小例子
int backVal = myQue.back();// 获取队列顶部元素的值
myQue.back() = 15; // 修改队列尾部的值
// 5
myQue.empty();// 判断队列是否为空
// 小例子
if(!myQue.empty())// 判断队列不是空就弹出队列头部元素, 就是出山洞
myQue.pop();
// 6
myQue.size();// 获取队列的内存了多少元素
// 小例子
int len = myQue.size();
}
// 遍历这个队列
for(auto x : myQue)
{
cout << x <<endl;
}_
还有一种用迭代器的我不太记得那个了, 我不常用那个
https://blog.csdn.net/woshihuangjianwei/article/details/78022521