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
",d[9]);//输出第十个数字
 43 
 44     //deque<int>::iterator dit;//引入迭代器
 45     //for (dit = d.begin(); dit != d.end(); ++dit)//遍历输出数组里的所有元素 然后进行输出
 46     //    printf("%d
",*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
",*myIt);
109 
110     printf("//=================
");
111 
112     for (myIt1 = myList_1.begin(); myIt1 != myList_1.end(); ++myIt1)//遍历myList_1的所有元素
113         printf("%d
", *myIt1);
114 
115     getchar();
116     return 0;
117 }
原文地址:https://www.cnblogs.com/liugangjiayou/p/11421733.html