宝塔山 发表于 2024-9-7 01:39:07

0902,DEQUE,LIST,VECTOR

目次
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

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

template <class T>
class vec{
public:
private:
    typedef T* _iterator;
};
void test(){
    /*1*/vector<int> num0;
    /*2*/vector<int> num1(10,5);//count same value

    int arr={0,1,2,3,4,5,6,7,8,9};
    /*3*/vector<int> num2(arr,arr+10);//[0,10)
    /*4*///copy & move
    /*5*/vector<int> num3{4,5,6,3,2,7,3,9};

    //-----------------------------------//
    vector<int>::iterator it=num1.begin();//未初始化迭代器
    for(;it!=num1.end();++it){
      cout<<*it<<" ";
    }
    cout<<endl;

    //-----------------------------------//
    for(size_t idx;idx!=sizeof(arr)/sizeof(arr);++idx){
      cout<<num1<<" ";
    }
    cout<<endl;

    //-----------------------------------//
    for(auto itt=num2.begin();itt!=num2.end();itt++){
      cout<<*itt<<" ";
    }
    cout<<endl;

    //-----------------------------------//
    for(auto &ele: num3){
      cout<<ele<<" ";
    }
    cout<<endl;
}

int main(void)
{
    test();
    return 0;
}
02_vector.cc

#include <iostream>
#include <vector>
#include <deque>
#include <list>
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;

template <typename Container>
void display(const Container & con){
    for(auto &ele: con){
      cout<<ele<<" ";
    }
    cout<<endl;
}
void display_cap(const vector<int> & con){
    cout<<endl;
    display(con);
    cout<<"size::"<<con.size()<<endl;
    cout<<"capacity::"<<con.capacity()<<endl;
}



//---------------------------------//
//vector可变数组
template <class T>
class vec{
public:
    T* data(){return _M_start;}
private:
    T* _M_start;         //第一个元素
    T* _M_finish;          //最后一个元素的下一个位置
    T* _M_end_of_storage;//最后一个空间的下一个位置
};
//---------------------------------//
//deque逻辑连续 物理存储分散
//中控器数组 Map-->小片段(内部连续)
//迭代器不是一个普通类型的指针,是一个类,对指针的基本功能都做了重载
template <class T>
class _Tp{
private:
    _Tp* _M_cur;
    _Tp* _M_first;
    _Tp* _M_last;
    /* _Map_pointer _M_node;//和中控器联系 */
};
template <class _Tp,class _Alloc>
class _deque_base{
};
//---------------------------------//




void test(){
    vector<int> num3{4,5,6,7,8,9};
    display(num3);
    num3.push_back(333);
    display(num3);
    num3.pop_back();
    display(num3);
    //vector不支持头部插入和删除,一端开口
    //效率——整体前移/后移

    cout<<"<<<<<<<<<<<<<<<<vector first number addr"<<endl;
    &num3;//error_M_tart
    cout<<&(*num3.begin())<<endl;
    cout<<&(num3)<<endl;
    int *pdata=num3.data();
    cout<<pdata<<endl;

    vector<int>::iterator v_it=num3.begin();
    v_it++;
    v_it+=2;
    cout<<"*v_it"<<*v_it<<endl;
    num3.insert(v_it,11);//insert front ,return cur
    display_cap(num3);
    cout<<"*v_it"<<*v_it<<endl;

    /* num3.insert(v_it,10,222);//迭代器失效 invalid pointer */
    v_it=num3.begin();
    num3.insert(v_it,10,222);//迭代器失效 invalid pointer
    display_cap(num3);
    cout<<"*v_it"<<*v_it<<endl;

    v_it=num3.begin();
    num3.insert(v_it,{666,777,888});
    display_cap(num3);
    cout<<"*v_it"<<*v_it<<endl;

    v_it=num3.begin();
    num3.insert(v_it,num3.begin(),num3.end());
    display_cap(num3);
    cout<<"*v_it"<<*v_it<<endl;
    //insert操作的时候,会导致底层发生扩容操作
    //迭代器还指向老的空间,老的空间已经回收了,所以
    //迭代器失效了
    //解决:每次都重新 置位 迭代器


    cout<<endl<<endl;
    //-----------------------------//
    list<int> num2{4,5,6,7,8,9};
    display(num2);
    num2.push_back(333);
    num2.push_front(44444);
    display(num2);
    num2.pop_back();
    num2.pop_front();
    display(num2);

    cout<<"<<<<<<<<<<<<<<<<<<list push anywhere"<<endl;
    list<int>::iterator l_it=num2.begin();
    l_it++;
    /* l_it+=2; */
    cout<<"*l_it"<<*l_it<<endl;
    num2.insert(l_it,11);//insert front ,return cur
    display(num2);
    cout<<"*l_it"<<*l_it<<endl;

    num2.insert(l_it,3,222);
    display(num2);
    cout<<"*l_it"<<*l_it<<endl;
    num2.insert(l_it,{666,777,888});
    display(num2);
    cout<<"*l_it"<<*l_it<<endl;
    num2.insert(l_it,num2.begin(),num2.end());
    display(num2);
    cout<<"*l_it"<<*l_it<<endl;


    cout<<endl<<endl;
    //-----------------------------//
    deque<int> num1{0,1,2,3,4,5,6,7};
    display(num1);
    num1.push_back(333);
    num1.push_front(44444);
    display(num1);
    num1.pop_back();
    num1.pop_front();
    display(num1);

    cout<<"<<<<<<<<<<<<<<<<<<deque push anywhere"<<endl;
    deque<int>::iterator d_it=num1.begin();
    d_it++;
    d_it+=2;
    cout<<"*d_it"<<*d_it<<endl;
    num1.insert(d_it,11);//insert前面一半,前移前面一半,后面一半后移
    display(num1);
    cout<<"*d_it"<<*d_it<<endl;

    num1.insert(d_it,3,222);
    display(num1);
    cout<<"*d_it"<<*d_it<<endl;
    num1.insert(d_it,{666,777,888});
    display(num1);
    cout<<"*d_it"<<*d_it<<endl;
    num1.insert(d_it,num1.begin(),num1.end());
    display(num1);
    cout<<"*d_it"<<*d_it<<endl;

    cout<<endl;

}

int main(void)
{
    test();
    return 0;
}
作业

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 下面步调有什么错误?

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

01 创建空容器
02 count个value
03 迭代器
04 {}
05 拷贝构造和移动构造
#include <iostream>
#include <vector>
#include <deque>
#include <list>
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;


template <class T>
void print( T & con){
    for(auto & ele: con){
      cout<<ele<<" ";
    }
    cout<<endl;
}

void test(){
    /*1*/vector<int> num0;
    /*2*/vector<int> num1(10,5);//count same value
    int arr={0,1,2,3,4,5,6,7,8,9};
    /*3*/vector<int> num2(arr,arr+10);//[0,10)
    /*4*/vector<int> num4(num1);
    /*4*/vector<int> num5(vector<int>{1,2,3});
    /*5*/vector<int> num3{4,5,6,3,2,7,3,9};
    print(num0);
    print(num1);
    print(num2);
    print(num3);
    print(num4);
    print(num5);
    cout<<endl;
}
void test1(){
    /*1*/deque<int> num0;
    /*2*/deque<int> num1(10,5);//count same value
    /*3*/deque<int> num2(num1.begin(),num1.end());//[0,10)
    /*4*/deque<int> num4(num1);
    /*4*/deque<int> num5(deque<int>{1,2,3});
    /*5*/deque<int> num3{4,5,6,3,2,7,3,9};
    print(num0);
    print(num1);
    print(num2);
    print(num3);
    print(num4);
    print(num5);
    cout<<endl;
}
void test2(){
    /*1*/list<int> num0;
    /*2*/list<int> num1(10,5);//count same value
    /*3*/list<int> num2(num1.begin(),num1.end());//[0,10)
    /*4*/list<int> num4(num1);
    /*4*/list<int> num5(list<int>{1,2,3});
    /*5*/list<int> num3{4,5,6,3,2,7,3,9};
    print(num0);
    print(num1);
    print(num2);
    print(num3);
    print(num4);
    print(num5);
    cout<<endl;
}
int main(void)
{
    test();
    test1();
    test2();
    return 0;
}
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的根本利用
//嘻嘻,每一个初始化都会worning

#include <iostream>
#include <vector>
#include <deque>
#include <string.h>
#include <random>
using std::cout;
using std::endl;
using std::vector;
using std::deque;
using std::ostream;

#definePER_NUM 5
#defineSCO_NUM 10

class Person{
public:
//const char* 坏,终于知道为什么worning了
    Person(char* name,int sc)
      :_name(new char()),_score(sc)
    {
      strcpy(_name,name);
    }
    Person(const Person & p)
      :_name(new char()),_score(p._score)
    {
      strcpy(_name,p._name);
    }//vector初始化使用拷贝构造
    ~Person(){
      if(_name){
            delete []_name;
            _name=nullptr;
      }
    }
    Person & operator=(const Person & p){
      if(this!=&p){
            delete [] _name;
            _name=new char();
            strcpy(_name,p._name);
            _score=p._score;
      }
      return *this;
    }
    void p_sc(int sc){
      _score=sc;
    }
    friend ostream & operator<<(ostream & os,const Person & p);
private:
    char* _name;
    int _score;
};
ostream & operator<<(ostream & os,const Person & p){
    os<<p._name<<"--"<<p._score<<"";
    return os;
}


//-------------------------//
void test(){
    Person p1("xixi",0);
    Person p2("jiajia",0);
    Person p3("kewu",0);
    Person p4("dada",0);
    Person p5("shazi",0);
    vector<Person> people{p1,p2,p3,p4,p5};

    std::random_device rd;
    //获取随机数种子
    std::mt19937 gen(rd());
    //生成随机数引擎
    std::uniform_int_distribution<> dis(60,100);
    //范围

    for(int i=0;i<PER_NUM;i++){
      deque<int> sc;
      for(int j=0;j<SCO_NUM;j++){
            sc.push_back(dis(gen));
            /* cout<<sc<<" "; */
      }
      /* cout<<endl; */
      int max=0,min=0,rel=0;
      for(auto & ele:sc){
            if(ele>max){max=ele;}
            if(ele<min){min=ele;}
            rel+=ele;
      }

      rel=(rel-max-min)/(SCO_NUM-2);
      people.p_sc(rel);
      cout<<people<<endl;
    }

    cout<<endl;
}
int main(void)
{
    test();
    return 0;
}
   #include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;

class Person
{
public:
        Person(const string &name,int score)
    : _name(name)
    , _score(score)
    {
        }

        string _name;
        int _score;
};

void creatPerson(vector<Person>& vec)
{
        string nameSeed = "ABCDE";

        for (int idx = 0; idx < 5; ++idx)
    {
                string name = "选手";
                name += nameSeed;

                int score = 0;
                Person p(name, score);
                vec.push_back(p);
        }
}

void setScore(vector<Person>& vec)
{
        for (vector<Person>::iterator it = vec.begin(); it != vec.end(); ++it)
        {
                deque<int> dq;
                for (int idx = 0; idx < 10; ++idx)
      {
            //将分数设定在范围中
                        int score = ::rand() % 41 + 60;//产生随机的分数
                        dq.push_back(score);
                }

      //对分数进行排序
                sort(dq.begin(), dq.end());
                dq.pop_front();//去掉最低分
                dq.pop_back();//去掉最高分

                int sum = 0;
                for (deque<int>::iterator dit = dq.begin(); dit != dq.end(); ++dit)
      {
                        sum += *dit;
                }
      //求10个评委的平均分
                int avg = sum/dq.size();
               
      //然后将10个评委的平均分赋值给每个选手
                it->_score = avg;       
    }
}

void showScore(vector<Person>& vec)
{
        for (vector<Person>::iterator it = vec.begin(); it != vec.end(); ++it)
    {
                cout << "姓名:" << it->_name << "平均分数:" << it->_score << endl;
        }
}

int main()
{
    //种随机种子
        ::srand(::clock());

    //定义Person类型的容器
        vector<Person> vec;

    //创建五名选手,创建容器类里面的成员及其属性
        creatPerson(vec);
    //给每个选手设定分数(让10个评委打分)
        setScore(vec);
    //显示每个选手的分数
        showScore(vec);       

        return 0;
} 不想看,虽然我的初始化一直woring
//Person(const char* name,int score)坏,终于知道为什么worning了
08 编程题:从一个 vector<char> 初始化一个 string。

提示:可以定义vector如下:vector<char> vc = { 'H', 'E', 'L', 'L', 'O' };然后查察如何给string进行初始化大概赋值,考查对vector与string的根本利用
#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <string>
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;
using std::string;


//---------------------------------//


void test(){
    vector<char>vc={'h','e','l','l','o'};
    string s1{'\0'};
    cout<<s1<<endl;
    for(auto & ele:vc){
      s1+=ele;
    }
    s1+='\0';
    cout<<s1<<endl;
}

int main(void)
{
    test();
    return 0;
}

   #include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
        vector<char> vc = { 'H', 'E', 'L', 'L', 'O' };
        string s(vc.data(), vc.size());
        cout << s << endl;
       

        return 0;
} 我好蠢嘻嘻
09 题目:利用vector打印九九乘法表。

提示:可以利用vector嵌套vector的利用方式。比方:vector<vector<int>>,然后就是veector的根本操作。
#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <string>
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;
using std::string;

//---------------------------------//

void print(vector<vector<int>>& con){
    for(int i=0;i<9;i++){
      for(auto & ell : con){
            cout<<(i+1)<<"×"<<ell<<"="<<(i+1)*(ell)<<"";
      }
      cout<<endl;
    }   
}


//---------------------------------//
void test(){
    vector<vector<int>> v1(9);
    for(int i=0;i<9;i++){
      vector<int> tempv;
      for(int j=0;j<=i;j++){
            tempv.push_back(j+1);
      }
      v1=tempv;
    }
    print(v1);
}


int main(void)
{
    test();
    return 0;
}
   #include<iostream>
#include<vector>

using namespace std;

int main()
{
        vector<vector<int> >v2d;
        for (int i = 0; i < 9; i++)
        {
                v2d.push_back(vector<int>());
        }
   
        for (int i = 0; i < v2d.size(); i++)
        {
                for (int j = 0; j <= i; j++)
                {
                        v2d.push_back((i + 1) * (j + 1));
                }
        }
        for (int i = 0; i < v2d.size(); i++)
        {
                for (int j = 0; j < v2d.size(); j++)
                {
                        cout << i + 1 << "*" << j + 1 << "=" << v2d << "\t";
                }
                cout << endl;
        }
        return 0;
}01,初始化9个空 vector<int>-->vector<vector<int>>
02,vector<int>存乘积
03,打印

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