0902,DEQUE,LIST,VECTOR

打印 上一主题 下一主题

主题 509|帖子 509|积分 1527

目次
01_vector.cc
02_vector.cc
作业
01STL包括哪些组件?各自具有哪些特点?
02 序列式容器包括哪些?他们之间有哪些异同?
03 下面步调有什么错误?
04 创建和初始化vector的方法,每种都给出一个实例?固然也可以把deque与list写出来
05 如果c1与c2是两个容器,下面的比力操作有什么限制?if(c1 < c2)
06 STL中的std::deque容器的实现原理?
07 评委打分的例子:要求:有五名选手ABCDE,10个评委打分,去掉最高分和最低分,求出每个选手的匀称分。
08 编程题:从一个 vector 初始化一个 string。
09 题目:利用vector打印九九乘法表。
01_vector.cc

  1. #include <iostream>
  2. #include <vector>
  3. using std::cout;
  4. using std::endl;
  5. using std::vector;
  6. template <class T>
  7. class vec{
  8. public:
  9. private:
  10.     typedef T* _iterator;
  11. };
  12. void test(){
  13.     /*1*/vector<int> num0;
  14.     /*2*/vector<int> num1(10,5);//count same value
  15.     int arr[10]={0,1,2,3,4,5,6,7,8,9};
  16.     /*3*/vector<int> num2(arr,arr+10);//[0,10)
  17.     /*4*///copy & move
  18.     /*5*/vector<int> num3{4,5,6,3,2,7,3,9};
  19.     //-----------------------------------//
  20.     vector<int>::iterator it=num1.begin();//未初始化迭代器
  21.     for(;it!=num1.end();++it){
  22.         cout<<*it<<" ";
  23.     }
  24.     cout<<endl;
  25.     //-----------------------------------//
  26.     for(size_t idx;idx!=sizeof(arr)/sizeof(arr[0]);++idx){
  27.         cout<<num1[idx]<<" ";
  28.     }
  29.     cout<<endl;
  30.     //-----------------------------------//
  31.     for(auto itt=num2.begin();itt!=num2.end();itt++){
  32.         cout<<*itt<<" ";
  33.     }
  34.     cout<<endl;
  35.     //-----------------------------------//
  36.     for(auto &ele: num3){
  37.         cout<<ele<<" ";
  38.     }
  39.     cout<<endl;
  40. }
  41. int main(void)
  42. {
  43.     test();
  44.     return 0;
  45. }
复制代码
02_vector.cc

  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. #include <list>
  5. using std::cout;
  6. using std::endl;
  7. using std::vector;
  8. using std::list;
  9. using std::deque;
  10. template <typename Container>
  11. void display(const Container & con){
  12.     for(auto &ele: con){
  13.         cout<<ele<<" ";
  14.     }
  15.     cout<<endl;
  16. }
  17. void display_cap(const vector<int> & con){
  18.     cout<<endl;
  19.     display(con);
  20.     cout<<"size::"<<con.size()<<endl;
  21.     cout<<"capacity::"<<con.capacity()<<endl;
  22. }
  23. //---------------------------------//
  24. //vector  可变数组
  25. template <class T>
  26. class vec{
  27. public:
  28.     T* data(){return _M_start;}
  29. private:
  30.     T* _M_start;           //第一个元素
  31.     T* _M_finish;          //最后一个元素的下一个位置
  32.     T* _M_end_of_storage;  //最后一个空间的下一个位置
  33. };
  34. //---------------------------------//
  35. //deque  逻辑连续 物理存储分散
  36. //中控器数组 Map  -->  小片段(内部连续)
  37. //迭代器不是一个普通类型的指针,是一个类,对指针的基本功能都做了重载
  38. template <class T>
  39. class _Tp{
  40. private:
  41.     _Tp* _M_cur;
  42.     _Tp* _M_first;
  43.     _Tp* _M_last;
  44.     /* _Map_pointer _M_node;  //和中控器联系 */
  45. };
  46. template <class _Tp,class _Alloc>
  47. class _deque_base{
  48. };
  49. //---------------------------------//
  50. void test(){
  51.     vector<int> num3{4,5,6,7,8,9};
  52.     display(num3);
  53.     num3.push_back(333);
  54.     display(num3);
  55.     num3.pop_back();
  56.     display(num3);
  57.     //vector不支持头部插入和删除,一端开口
  58.     //效率——整体前移/后移
  59.     cout<<"<<<<<<<<<<<<<<<<vector first number addr"<<endl;
  60.     &num3;//error  _M_tart
  61.     cout<<&(*num3.begin())<<endl;
  62.     cout<<&(num3[0])<<endl;
  63.     int *pdata=num3.data();
  64.     cout<<pdata<<endl;
  65.     vector<int>::iterator v_it=num3.begin();
  66.     v_it++;
  67.     v_it+=2;
  68.     cout<<"*v_it  "<<*v_it<<endl;
  69.     num3.insert(v_it,11);//insert front ,return cur
  70.     display_cap(num3);
  71.     cout<<"*v_it  "<<*v_it<<endl;
  72.     /* num3.insert(v_it,10,222);//迭代器失效 invalid pointer */
  73.     v_it=num3.begin();
  74.     num3.insert(v_it,10,222);//迭代器失效 invalid pointer
  75.     display_cap(num3);
  76.     cout<<"*v_it  "<<*v_it<<endl;
  77.     v_it=num3.begin();
  78.     num3.insert(v_it,{666,777,888});
  79.     display_cap(num3);
  80.     cout<<"*v_it  "<<*v_it<<endl;
  81.     v_it=num3.begin();
  82.     num3.insert(v_it,num3.begin(),num3.end());
  83.     display_cap(num3);
  84.     cout<<"*v_it  "<<*v_it<<endl;
  85.     //insert操作的时候,会导致底层发生扩容操作
  86.     //迭代器还指向老的空间,老的空间已经回收了,所以
  87.     //迭代器失效了
  88.     //解决:每次都重新 置位 迭代器
  89.     cout<<endl<<endl;
  90.     //-----------------------------//
  91.     list<int> num2{4,5,6,7,8,9};
  92.     display(num2);
  93.     num2.push_back(333);
  94.     num2.push_front(44444);
  95.     display(num2);
  96.     num2.pop_back();
  97.     num2.pop_front();
  98.     display(num2);
  99.     cout<<"<<<<<<<<<<<<<<<<<<list push anywhere"<<endl;
  100.     list<int>::iterator l_it=num2.begin();
  101.     l_it++;
  102.     /* l_it+=2; */
  103.     cout<<"*l_it  "<<*l_it<<endl;
  104.     num2.insert(l_it,11);//insert front ,return cur
  105.     display(num2);
  106.     cout<<"*l_it  "<<*l_it<<endl;
  107.     num2.insert(l_it,3,222);
  108.     display(num2);
  109.     cout<<"*l_it  "<<*l_it<<endl;
  110.     num2.insert(l_it,{666,777,888});
  111.     display(num2);
  112.     cout<<"*l_it  "<<*l_it<<endl;
  113.     num2.insert(l_it,num2.begin(),num2.end());
  114.     display(num2);
  115.     cout<<"*l_it  "<<*l_it<<endl;
  116.     cout<<endl<<endl;
  117.     //-----------------------------//
  118.     deque<int> num1{0,1,2,3,4,5,6,7};
  119.     display(num1);
  120.     num1.push_back(333);
  121.     num1.push_front(44444);
  122.     display(num1);
  123.     num1.pop_back();
  124.     num1.pop_front();
  125.     display(num1);
  126.     cout<<"<<<<<<<<<<<<<<<<<<deque push anywhere"<<endl;
  127.     deque<int>::iterator d_it=num1.begin();
  128.     d_it++;
  129.     d_it+=2;
  130.     cout<<"*d_it  "<<*d_it<<endl;
  131.     num1.insert(d_it,11);//insert前面一半,前移前面一半,后面一半后移
  132.     display(num1);
  133.     cout<<"*d_it  "<<*d_it<<endl;
  134.     num1.insert(d_it,3,222);
  135.     display(num1);
  136.     cout<<"*d_it  "<<*d_it<<endl;
  137.     num1.insert(d_it,{666,777,888});
  138.     display(num1);
  139.     cout<<"*d_it  "<<*d_it<<endl;
  140.     num1.insert(d_it,num1.begin(),num1.end());
  141.     display(num1);
  142.     cout<<"*d_it  "<<*d_it<<endl;
  143.     cout<<endl;
  144. }
  145. int main(void)
  146. {
  147.     test();
  148.     return 0;
  149. }
复制代码
作业

01STL包括哪些组件?各自具有哪些特点?

01 容器(用来存放数据,也是数据结构
02 算法(用来实现容器的算法操作
03 迭代器(用来访问容器中的成员,是广义上的指针,也叫泛型指针
04 适配器(起到适配的作用
05 函数对象(仿函数:进行定制化操作
06 空间配置器(对空间的申请和开释进行管理
02 序列式容器包括哪些?他们之间有哪些异同?

01 vector 可变数组
02 deque 双向队列
03 list 双向链表
04 foward_list 单向链表
05 array 数组
内存上,array 和 vector是一片连续的空间,别的是逻辑上连续,物理存储时分散的
实现上,vector底层通过三个指针实现,分别指向第一个元素的位置,最后一个元素的下一个位置,最后一个空间的下一个位置;
deque的实现依赖  中控器数组Map+小片段实现的,片段内部是连续的,片段与片段之间是不连续的,当deque必要扩容时,直接对Map进行扩容,申请新的小片段(小片段成员包括四个指针,分别指向第一个元素,最后一个元素,当前元素,一个指针用于和Map进行联系)
list 链表喵
利用上,deque,vector支持随机访问,list不支持
03 下面步调有什么错误?

  1. list<int> lst;
  2. list<int>::iterator iter1 = lst.begin(), iter2 = lst.end();
  3. while(iter1 < iter2)
  4. {   
  5.      //....
  6. }
复制代码
list的迭代器不能进行<比力,要用迭代器特有的!=
04 创建和初始化vector的方法,每种都给出一个实例?固然也可以把deque与list写出来

01 创建空容器
02 count个value
03 迭代器
04 {}
05 拷贝构造和移动构造
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. #include <list>
  5. using std::cout;
  6. using std::endl;
  7. using std::vector;
  8. using std::list;
  9. using std::deque;
  10. template <class T>
  11. void print( T & con){
  12.     for(auto & ele: con){
  13.         cout<<ele<<" ";
  14.     }
  15.     cout<<endl;
  16. }
  17. void test(){
  18.     /*1*/vector<int> num0;
  19.     /*2*/vector<int> num1(10,5);//count same value
  20.     int arr[10]={0,1,2,3,4,5,6,7,8,9};
  21.     /*3*/vector<int> num2(arr,arr+10);//[0,10)
  22.     /*4*/vector<int> num4(num1);
  23.     /*4*/vector<int> num5(vector<int>{1,2,3});
  24.     /*5*/vector<int> num3{4,5,6,3,2,7,3,9};
  25.     print(num0);
  26.     print(num1);
  27.     print(num2);
  28.     print(num3);
  29.     print(num4);
  30.     print(num5);
  31.     cout<<endl;
  32. }
  33. void test1(){
  34.     /*1*/deque<int> num0;
  35.     /*2*/deque<int> num1(10,5);//count same value
  36.     /*3*/deque<int> num2(num1.begin(),num1.end());//[0,10)
  37.     /*4*/deque<int> num4(num1);
  38.     /*4*/deque<int> num5(deque<int>{1,2,3});
  39.     /*5*/deque<int> num3{4,5,6,3,2,7,3,9};
  40.     print(num0);
  41.     print(num1);
  42.     print(num2);
  43.     print(num3);
  44.     print(num4);
  45.     print(num5);
  46.     cout<<endl;
  47. }
  48. void test2(){
  49.     /*1*/list<int> num0;
  50.     /*2*/list<int> num1(10,5);//count same value
  51.     /*3*/list<int> num2(num1.begin(),num1.end());//[0,10)
  52.     /*4*/list<int> num4(num1);
  53.     /*4*/list<int> num5(list<int>{1,2,3});
  54.     /*5*/list<int> num3{4,5,6,3,2,7,3,9};
  55.     print(num0);
  56.     print(num1);
  57.     print(num2);
  58.     print(num3);
  59.     print(num4);
  60.     print(num5);
  61.     cout<<endl;
  62. }
  63. int main(void)
  64. {
  65.     test();
  66.     test1();
  67.     test2();
  68.     return 0;
  69. }
复制代码
05 如果c1与c2是两个容器,下面的比力操作有什么限制?if(c1 < c2)

01,是相同的容器类型
02,容器的元素类型支持比力操作
03,容器内部元素的次序性比力(deque,vector支持,list不支持,只能利用!=)
04,容器支持随机访问元素
06 STL中的std::deque容器的实现原理?

deque的实现依赖  中控器数组Map+小片段实现的,片段内部是连续的,片段与片段之间是不连续的,当deque必要扩容时,直接对Map进行扩容,申请新的小片段(小片段成员包括四个指针,分别指向第一个元素,最后一个元素,当前元素,一个指针用于和Map进行联系)
07 评委打分的例子:要求:有五名选手ABCDE,10个评委打分,去掉最高分和最低分,求出每个选手的匀称分。

思绪: 
1.创建Person类,定义name,score成员属性;创建五名选手存放到vector容器中;
2.遍历vector容器,首先10个评委的打分存放到deque容器中,sort算法对分数排序,去掉最高最低分;
3.deque容器遍历,进行剩余分数的累加,求匀称;
4.输出每个选手的姓名,结果
提示:还是容器vector与deque的根本利用
  1. //嘻嘻,每一个初始化都会worning
  2. #include <iostream>
  3. #include <vector>
  4. #include <deque>
  5. #include <string.h>
  6. #include <random>
  7. using std::cout;
  8. using std::endl;
  9. using std::vector;
  10. using std::deque;
  11. using std::ostream;
  12. #define  PER_NUM 5
  13. #define  SCO_NUM 10
  14. class Person{
  15. public:
  16. //const char* 坏,终于知道为什么worning了
  17.     Person(char* name,int sc)
  18.         :_name(new char[strlen(name)+1]()),_score(sc)
  19.     {
  20.         strcpy(_name,name);
  21.     }
  22.     Person(const Person & p)
  23.         :_name(new char[strlen(p._name)+1]()),_score(p._score)
  24.     {
  25.         strcpy(_name,p._name);
  26.     }//vector初始化使用拷贝构造
  27.     ~Person(){
  28.         if(_name){
  29.             delete []  _name;
  30.             _name=nullptr;
  31.         }
  32.     }
  33.     Person & operator=(const Person & p){
  34.         if(this!=&p){
  35.             delete [] _name;
  36.             _name=new char[strlen(p._name)+1]();
  37.             strcpy(_name,p._name);
  38.             _score=p._score;
  39.         }
  40.         return *this;
  41.     }
  42.     void p_sc(int sc){
  43.         _score=sc;
  44.     }
  45.     friend ostream & operator<<(ostream & os,const Person & p);
  46. private:
  47.     char* _name;
  48.     int _score;
  49. };
  50. ostream & operator<<(ostream & os,const Person & p){
  51.     os<<p._name<<"--"<<p._score<<"  ";
  52.     return os;
  53. }
  54. //-------------------------//
  55. void test(){
  56.     Person p1("xixi",0);
  57.     Person p2("jiajia",0);
  58.     Person p3("kewu",0);
  59.     Person p4("dada",0);
  60.     Person p5("shazi",0);
  61.     vector<Person> people{p1,p2,p3,p4,p5};
  62.     std::random_device rd;
  63.     //获取随机数种子
  64.     std::mt19937 gen(rd());
  65.     //生成随机数引擎
  66.     std::uniform_int_distribution<> dis(60,100);
  67.     //范围
  68.     for(int i=0;i<PER_NUM;i++){
  69.         deque<int> sc;
  70.         for(int j=0;j<SCO_NUM;j++){
  71.             sc.push_back(dis(gen));
  72.             /* cout<<sc[j]<<" "; */
  73.         }
  74.         /* cout<<endl; */
  75.         int max=0,min=0,rel=0;
  76.         for(auto & ele:sc){
  77.             if(ele>max){max=ele;}
  78.             if(ele<min){min=ele;}
  79.             rel+=ele;
  80.         }
  81.         rel=(rel-max-min)/(SCO_NUM-2);
  82.         people[i].p_sc(rel);
  83.         cout<<people[i]<<endl;
  84.     }
  85.     cout<<endl;
  86. }
  87. int main(void)
  88. {
  89.     test();
  90.     return 0;
  91. }
复制代码
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <deque>
  5. #include <algorithm>
  6. using namespace std;
  7. class Person
  8. {
  9. public:
  10.         Person(const string &name,int score)
  11.     : _name(name)
  12.     , _score(score)
  13.     {
  14.         }
  15.         string _name;
  16.         int _score;
  17. };
  18. void creatPerson(vector<Person>& vec)
  19. {
  20.         string nameSeed = "ABCDE";
  21.         for (int idx = 0; idx < 5; ++idx)
  22.     {
  23.                 string name = "选手";
  24.                 name += nameSeed[idx];
  25.                 int score = 0;
  26.                 Person p(name, score);
  27.                 vec.push_back(p);
  28.         }
  29. }
  30. void setScore(vector<Person>& vec)
  31. {
  32.         for (vector<Person>::iterator it = vec.begin(); it != vec.end(); ++it)
  33.         {
  34.                 deque<int> dq;
  35.                 for (int idx = 0; idx < 10; ++idx)
  36.         {
  37.             //将分数设定在[60, 100]范围中
  38.                         int score = ::rand() % 41 + 60;//产生随机的分数
  39.                         dq.push_back(score);
  40.                 }
  41.         //对分数进行排序
  42.                 sort(dq.begin(), dq.end());
  43.                 dq.pop_front();//去掉最低分
  44.                 dq.pop_back();//去掉最高分
  45.                 int sum = 0;
  46.                 for (deque<int>::iterator dit = dq.begin(); dit != dq.end(); ++dit)
  47.         {
  48.                         sum += *dit;
  49.                 }
  50.         //求10个评委的平均分
  51.                 int avg = sum/dq.size();
  52.                
  53.         //然后将10个评委的平均分赋值给每个选手
  54.                 it->_score = avg;       
  55.     }
  56. }
  57. void showScore(vector<Person>& vec)
  58. {
  59.         for (vector<Person>::iterator it = vec.begin(); it != vec.end(); ++it)
  60.     {
  61.                 cout << "姓名:" << it->_name << "  平均分数:" << it->_score << endl;
  62.         }
  63. }
  64. int main()
  65. {
  66.     //种随机种子
  67.         ::srand(::clock());
  68.     //定义Person类型的容器
  69.         vector<Person> vec;
  70.     //创建五名选手,创建容器类里面的成员及其属性
  71.         creatPerson(vec);
  72.     //给每个选手设定分数(让10个评委打分)
  73.         setScore(vec);
  74.     //显示每个选手的分数
  75.         showScore(vec);       
  76.         return 0;
  77. }
复制代码
 不想看,虽然我的初始化一直woring
//Person(const char* name,int score)坏,终于知道为什么worning了
  08 编程题:从一个 vector<char> 初始化一个 string。

提示:可以定义vector如下:vector<char> vc = { 'H', 'E', 'L', 'L', 'O' };然后查察如何给string进行初始化大概赋值,考查对vector与string的根本利用
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. #include <list>
  5. #include <string>
  6. using std::cout;
  7. using std::endl;
  8. using std::vector;
  9. using std::list;
  10. using std::deque;
  11. using std::string;
  12. //---------------------------------//
  13. void test(){
  14.     vector<char>vc={'h','e','l','l','o'};
  15.     string s1{'\0'};
  16.     cout<<s1<<endl;
  17.     for(auto & ele:vc){
  18.         s1+=ele;
  19.     }
  20.     s1+='\0';
  21.     cout<<s1<<endl;
  22. }
  23. int main(void)
  24. {
  25.     test();
  26.     return 0;
  27. }
复制代码
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5. int main()
  6. {
  7.         vector<char> vc = { 'H', 'E', 'L', 'L', 'O' };
  8.         string s(vc.data(), vc.size());
  9.         cout << s << endl;
  10.        
  11.         return 0;
  12. }
复制代码
 我好蠢嘻嘻
  09 题目:利用vector打印九九乘法表。

提示:可以利用vector嵌套vector的利用方式。比方:vector<vector<int>>,然后就是veector的根本操作。
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. #include <list>
  5. #include <string>
  6. using std::cout;
  7. using std::endl;
  8. using std::vector;
  9. using std::list;
  10. using std::deque;
  11. using std::string;
  12. //---------------------------------//
  13. void print(vector<vector<int>>  & con){
  14.     for(int i=0;i<9;i++){
  15.         for(auto & ell : con[i]){
  16.             cout<<(i+1)<<"×"<<ell<<"="<<(i+1)*(ell)<<"  ";
  17.         }
  18.         cout<<endl;
  19.     }   
  20. }
  21. //---------------------------------//
  22. void test(){
  23.     vector<vector<int>> v1(9);
  24.     for(int i=0;i<9;i++){
  25.         vector<int> tempv;
  26.         for(int j=0;j<=i;j++){
  27.             tempv.push_back(j+1);
  28.         }
  29.         v1[i]=tempv;
  30.     }
  31.     print(v1);
  32. }
  33. int main(void)
  34. {
  35.     test();
  36.     return 0;
  37. }
复制代码
  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main()
  5. {
  6.         vector<vector<int> >v2d;
  7.         for (int i = 0; i < 9; i++)
  8.         {
  9.                 v2d.push_back(vector<int>());
  10.         }
  11.    
  12.         for (int i = 0; i < v2d.size(); i++)
  13.         {
  14.                 for (int j = 0; j <= i; j++)
  15.                 {
  16.                         v2d[i].push_back((i + 1) * (j + 1));
  17.                 }
  18.         }
  19.         for (int i = 0; i < v2d.size(); i++)
  20.         {
  21.                 for (int j = 0; j < v2d[i].size(); j++)
  22.                 {
  23.                         cout << i + 1 << "*" << j + 1 << "=" << v2d[i][j] << "\t";
  24.                 }
  25.                 cout << endl;
  26.         }
  27.         return 0;
  28. }
复制代码
01,初始化9个空 vector<int>-->vector<vector<int>>
  02,vector<int>存乘积
  03,打印

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表