1.标准模板库STL
vector(动态数组)
vector中的元素在内存中是连续存储的。vector的实现是由一个动态数组构成。当空间不够的时候, 采用类似于C语言的realloc函数重新分配空间. 正是因为vector中的元素是连续存储的, 所以vector支持常数时间内完成元素的随机访问。
vector支持[]和at()遍历元素,由于结构上是数组,所以头插效果很低。~vector();释放空间。
实例
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printV(vector<int>&v){
vector<int>::iterator it_s=v.begin();//迭代器的开头
vector<int>::iterator it_e=v.end();//迭代器的末尾,指针指向最后一个元素的下一个
printf("==========================\n");
printf("SIZE=%d\n",v.size());
while(it_s!=it_e){
printf("%d ",*it_s++);
}
printf("\n");
printf("==========================\n");
}
int main(){
vector<int>a;//初始化1
printf("一开始的大小:%d\n",a.size());
a.push_back(1);
a.push_back(2);
printf("a添加过2个元素的大小:%d\n",a.size());
vector<int>b(10,3);//初始化2
printf("定义10个int型元素(元素都是3)的大小:%d\n",b.size());
b.push_back(18);
b.push_back(20);
printf("c添加过2个元素的大小:%d\n",b.size());
printV(b);
vector<int>c(10);//初始化3
printf("定义10个int型元素的大小:%d\n",c.size());
for(int i=0;i<c.size()-2;i++){
c[i]=i;
}
printV(c);
vector<int>d=c;//复制
printf("将c复制给d\n");
printV(d);
d=b;
printf("将b复制给d\n");
printV(d);//复制
vector<int>e (b.begin(),b.end());//初始化4
printf("b的开始元素,b的最后一个元素\n");
printV(e);
vector<int>f (b.begin()+5,b.end());//初始化5
printf("b的开始元素+5,b的最后一个元素\n");
printV(f);
b.resize(20);
printf("对b进行填充\n");
printV(b);
b.resize(8);
printf("对b进行缩小\n");
printV(b);
b.erase(b.begin()+2,b.end());//删除
printV(b);
printf("删除b中的元素\n");
c.insert(c.begin()+2,b.begin(),b.end());//(从哪开始插入,插入什么到什么)
printV(c);
return 0;
}
deque
deque与vector非常相似。它也采用动态数组管理元素,提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。
deque与vector组织内存的方式不一样。在底层,deque按“页”(page)或“块”(chunk)来分配存储器,每页包含固定数目的元素。而vector只分配一块连续的内存。
n个人排成圈,报3的推出(下面的是13)
#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
int main(){
deque<int>a;
for(int i=1;i<=13;i++){
a.push_back(i);//尾部追加
}
int k=0;
while(a.size()){
k++;
int c=a