deque & list
deque
双向队列 它也是采用动态数组的方式来管理的提供了随机数组
和vector的区别
1.deque头尾两端可以开放,能够进行快速的插入和删除(vector只能在尾部进行快速的插入和删除)
2.deque的内部结构和vector相比较vector会多一个间接的过程,元素的存取相比较vector而言要慢一点
3.迭代器需要在不同的区域进行跳转,所以迭代器必须是一个只能指针
4.在对内存区有限制的系统当中,deque可以内涵更多的元素
5.deque不支持容量和内存重分配时机的控制
6.deque的内存块不再被使用的时候可以被释放
deque的操作几项和vector不同
不提供容量的操作capcity reserve
提供了push_front,pop_front头删头插
相似
1.在中部插入和删除元素速度相对慢
2.迭代器和vector相似,随机存取迭代器
在生活中用到的更多是vector
如果需要在头尾进行快速的插入和删除会选择deque
list
双向链表
list和vector的区别
1.不支持随机存取,如果要存第八个元素,必须先遍历前面七个元素
2.在热河位置上进行插入和删除 都很快
3.插入和删除并不会造成指针,迭代器或引用的失效
list的成员函数
1.不支持随机存取,没有at(),[]运算符
2.list也没有提供容量,内存重分配的函数
3.list提供了一些特殊的成员函数
list不连续 通过循环后移指针
1 #include <deque> 2 using std::deque; 3 #include<list> 4 using std::list; 5 #include <vector> 6 using std ::vector; 7 bool isBase(int var)//只能有一个参数 返回值为奇数 8 { 9 return var%2==1; 10 } 11 bool isMin(int a,int b)//返回最小值 12 { 13 return a<b; 14 } 15 bool isMax(int a,int b)//返回最大值 16 { 17 return a>b; 18 } 19 //bool sort(int arr[],int len,bool (*isFun)(int,int))//三个参数 数组 长度 返回值(最大 最小) 20 //{ 21 // for (int i=0;i<len-1;i++) 22 // { 23 // for (int j=i+1;j<len;++j) 24 // { 25 // if (isFun(arr[i],arr[j]))//调用isFun函数 使用isMin或者isMax做参数进行升序或者降序 26 // { 27 // int temp=arr[i]; 28 // arr[i]=arr[j]; 29 // arr[i]=temp; 30 // } 31 // } 32 // } 33 //}这是一种排序的方式 34 int main() 35 { 36 //deque<int> d;//定义一个队列指针 37 //for (int i = 0; i < 10; ++i)//在队尾插入十个元素 38 // d.push_back(i + 1); 39 //for (int i = 0; i < 5; ++i)//在队头插入5个元素 40 // d.push_front((i + 1) * 10); 41 42 //printf("%d\n",d[9]);//输出第十个数字 43 44 //deque<int>::iterator dit;//引入迭代器 45 //for (dit = d.begin(); dit != d.end(); ++dit)//遍历输出数组里的所有元素 然后进行输出 46 // printf("%d\n",*dit); 47 list<int> myList; 48 for (int i=0;i<10;i++) 49 { 50 myList.push_back(i+1);//双向链表的尾插 51 } 52 myList.push_front(1);//在头部插入一个数字1 53 //myList.pop_back();//在尾部进行删除 54 //myList.pop_front();//在头部进行删除 55 list<int>::iterator myIt,mm;//迭代器进行排序 56 myIt=myList.begin(); 57 for (int i=0;i<4;++i) 58 myIt++;//指针往后移四位 59 mm=myIt; 60 for (int i=0;i<5;++i) 61 { 62 mm++; 63 }//指针再往后移动五位 64 myList.push_back(1); 65 myList.push_back(1); 66 myList.push_back(1); 67 myList.push_back(1);//往后追加四个元素 68 //myList.remove(1);//把list中所有元素值为参数这个值的元素删除 把所有的1删除 69 //myList.remove_if(isBase);//删除list中所有的元素与isBase这个函数做操作后结果为true的元素 70 //isBase只能有一个参数 71 //myList.unique();//无参函数,如果存在若干相邻且数值相同,删除重复元素,只留下一个 72 //myList.unique(isMin);//如果存在若干相邻,且这两个相邻的数进入isMin函数后结果为true,认为也是重复元素,删除重复,只留一个 73 list<int> myList_1; 74 list<int>::iterator myIt1; 75 myIt1=myList_1.begin();//迭代器指向起始位置 76 //myList_1.splice(myIt1, myList);//把myList里面的所有元素移动到myList_1的MyIt1这个迭代器位置 77 //myList_1.splice(myIt1, myList, myIt); 78 //myList_1.splice(myIt1, myList, myIt, mm); 79 80 //myList.sort();//没有参数 81 //myList.sort(isMax); 82 83 //myList.reverse();//反序 84 myList.clear(); 85 //for (int i = 0; i < 5; ++i) 86 // myList.push_back((i + 1) * 2); 87 myList.push_back(4); 88 myList.push_back(10); 89 myList.push_back(6); 90 myList.push_back(2); 91 myList.push_back(8); 92 myList.sort(isMax); 93 94 myList_1.clear(); 95 //for (int i = 0; i < 5; ++i) 96 // myList_1.push_back(i * 2 + 1);//尾部压入 97 myList_1.push_back(7); 98 myList_1.push_back(3); 99 myList_1.push_back(9); 100 myList_1.push_back(1); 101 myList_1.push_back(5); 102 myList_1.sort(isMax); 103 //myList.merge(myList_1);//myList和myList_1必须是已经排好序的容器,且排序规则是一致的,升序 104 myList.merge(myList_1,isMax); 105 106 107 for (myIt = myList.begin(); myIt != myList.end(); ++myIt)//遍历myList的李的所有元素 108 printf("%d\n",*myIt); 109 110 printf("//=================\n"); 111 112 for (myIt1 = myList_1.begin(); myIt1 != myList_1.end(); ++myIt1)//遍历myList_1的所有元素 113 printf("%d\n", *myIt1); 114 115 getchar(); 116 return 0; 117 }