STL vector容器 和deque容器
前言
STL是C++的框架,然后vector容器和deque容器又是STL的一部分...
这块的内容都是理解、概念为主,没什么捷径,希望读者能静下来记。
先来讲vector容器(单端动态数组)
1、vector大小操作
size();返回容器中元素的个数。
empty();//判断容器是否为空
resize(int num);//重新制定容器的长度为num,若容器变长,则以默认值填充新位置(0),如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num,elem);//重新制定容器的长度num,若容器边长,则以elem值填充新位置,如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量。
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
1 void test02() 2 { 3 vector<int> v; 4 v.push_back(10); 5 v.push_back(20); 6 v.push_back(30); 7 v.push_back(40); 8 9 if(v.empty()) 10 { 11 cout<<"v容器为空"<<endl; 12 } 13 else 14 { 15 cout<<"容器非空"<<endl; 16 cout<<"size = "<<v.size()<<endl; 17 cout<<"capacity = "<<v.capacity()<<endl; 18 //容量 >= size 19 } 20 21 printVectorInt(v);//10 20 30 40 22 //resize(int num);//重新指定容器的长度为num 23 //多出的部分 自动补0 24 v.resize(8); 25 printVectorInt(v);//10 20 30 40 0 0 0 0 26 27 //resize(int num, elem);//重新指定容器的长度为num, 28 //若容器变长,则以elem值填充 29 v.resize(10,5); 30 printVectorInt(v);//10 20 30 40 0 0 0 0 5 5 31 32 v.resize(2); 33 printVectorInt(v);//10 20 34 }
注意:resize 是作用于容器大小,不会更改容器容量。
2、使用resize、swap收缩容器的容量
1 void test04() 2 { 3 vector<int> v; 4 for(int i=0;i<1000;i++) 5 { 6 v.push_back(i); 7 } 8 cout<<"size = "<<v.size()<<endl;//1000 9 cout<<"capactiy = "<<v.capacity()<<endl;//1024 10 11 //使用reszie将空间 置成10个元素(可以吗?) 12 v.resize(10);//不能修改容量 只能修改size 13 cout<<"size = "<<v.size()<<endl;//10 14 cout<<"capactiy = "<<v.capacity()<<endl;//1024 15 16 //使用swap收缩容器的容量 17 vector<int>(v).swap(v); 18 19 cout<<"size = "<<v.size()<<endl;//10 20 cout<<"capactiy = "<<v.capacity()<<endl;//10 21 }
3、reserve预留空间大小
4、数据的存取
at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
1 void test06() 2 { 3 vector<int> v; 4 v.push_back(10); 5 v.push_back(20); 6 v.push_back(30); 7 v.push_back(40); 8 9 printVectorInt(v);//10 20 30 40 10 cout<<v[2]<<endl;//30 11 cout<<v.at(2)<<endl;//30 12 //[] 越界 不抛出异常 13 //at 越界 抛出异常 14 15 cout<<"front = "<<v.front()<<endl;//10 16 cout<<"back = "<<v.back()<<endl;//40 17 }
6、vector容器的插入和删除
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素
1 void test07() 2 { 3 vector<int> v; 4 v.push_back(10); 5 v.push_back(20); 6 v.push_back(30); 7 v.push_back(40); 8 printVectorInt(v);//10 20 30 40 9 10 //insert(const_iterator pos, int count,ele); 11 //迭代器指向位置pos插入count个元素ele. 12 v.insert(v.begin()+2,3,100); 13 printVectorInt(v);//10 20 100 100 100 30 40 14 15 //尾部删除:pop_back();//删除最后一个元素 16 v.pop_back();//将40删除了 17 printVectorInt(v);//10 20 100 100 100 30 18 19 //erase(const_iterator start, const_iterator end); 20 //删除迭代器从start到end之间的元素 21 v.erase(v.begin()+2, v.end()-1); 22 printVectorInt(v);//10 20 30 23 24 //erase(const_iterator pos);//删除迭代器指向的元素 25 v.erase(v.begin()+1);//删除20的位置 26 printVectorInt(v);//10 30 27 28 cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl; 29 30 //clear();//删除容器中所有元素 31 v.clear(); 32 printVectorInt(v);//啥也没有 33 cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl; 34 }
好了vector事例就是以上几点..现在来讲deque容器(双端动态数组)
1、deque容器的构造 和赋值
deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。
3.3.3.2 deque赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符
swap(deq);// 将deq与本身的元素互换
1 void printDequeInt(deque<int> &d) 2 { 3 for(deque<int>::iterator it=d.begin();it!=d.end();it++) 4 { 5 cout<<*it<<" "; 6 } 7 cout<<endl; 8 } 9 void test01() 10 { 11 deque<int> d(5,10); 12 printDequeInt(d);//10 10 10 10 10 13 14 //assign(n, elem);//将n个elem拷贝赋值给本身。 15 deque<int> d1; 16 d1.assign(5,100); 17 printDequeInt(d1);//100 100 100 100 100 18 19 //deque& operator=(const deque &deq); //重载等号操作符 20 deque<int> d2; 21 d2 = d1; 22 printDequeInt(d2);//100 100 100 100 100 23 24 //swap(deq);// 将deq与本身的元素互换 25 deque<int> d3(5,1); 26 deque<int> d4(5,2); 27 printDequeInt(d3);//1 1 1 1 1 28 printDequeInt(d4);//2 2 2 2 2 29 d3.swap(d4); 30 printDequeInt(d3);//2 2 2 2 2 31 printDequeInt(d4);//1 1 1 1 1 32 }
2、deque容器的大小操作、双端插入删除操作、元素访问操作
3.3.3.3 deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
3.3.3.4 deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
3.3.3.5 deque数据存取
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
front();//返回第一个数据。
back();//返回最后一个数据
1 void test02() 2 { 3 deque<int> d; 4 //尾部插入 5 d.push_back(10); 6 d.push_back(20); 7 d.push_back(30);//10 20 30 8 9 //头部插入 10 d.push_front(40); 11 d.push_front(50); 12 d.push_front(60); 13 printDequeInt(d);//60 50 40 10 20 30 14 15 //头部删除 16 d.pop_front();//50 40 10 20 30 17 //尾部删除 18 d.pop_back();//50 40 10 20 19 printDequeInt(d);//50 40 10 20 20 21 if(d.empty()) 22 { 23 cout<<"d容器为空"<<endl; 24 } 25 else 26 { 27 cout<<"d容器非空"<<endl; 28 cout<<"size = "<<d.size()<<endl;//4 29 } 30 31 //[]访问第二个元素 32 cout<<"d[2] = "<<d[2]<<endl;//10 33 cout<<"d.at(2) = "<<d.at(2)<<endl;//10 34 cout<<"头元素 = "<<d.front()<<endl;//50 35 cout<<"尾元素 = "<<d.back()<<endl;//20 36 }
3、容器的插入删除
3.3.3.6 deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
3.3.3.7 deque删除操作
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置
1 void test03() 2 { 3 deque<int> d; 4 d.insert(d.begin(),5, 100); 5 printDequeInt(d);//100 100 100 100 100 6 7 d.clear(); 8 cout<<"size = "<<d.size()<<endl;//0 9 }
5、srand设置随机种子 rand 产生随机数
1 #include <iostream> 2 #include<time.h> 3 using namespace std; 4 5 int main(int argc, char *argv[]) 6 { 7 //设置随机数种子time(NULL)获取当前时间 8 srand(time(NULL)); 9 10 for(int i=0;i<10; i++) 11 { 12 //rand()函数的返回值就是随机数 13 int num = rand(); 14 cout<<num<<" "; 15 } 16 cout<<endl; 17 return 0; 18 }
deque容器和vector容器最大的差异:
a、deque插入和删除 常数项时间(不会因为数据量的大小 改变操作所耗时)
b、deque容器没有容量的概念 以分段连续空间组成。
c、Deque是由一段一段的定量的连续空间构成。