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 
#include 
using std::cout;
using std::endl;
using std::vector;

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

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

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

02_vector.cc

#include 
#include 
#include 
#include 
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;

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




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

    cout<<"<<<<<<<<<<<<<<<::iterator v_it=num3.begin();
    v_it++;
    v_it+=2;
    cout<<"*v_it  "<<*v_it< 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<<"<<<<<<<<<<<<<<<<<::iterator l_it=num2.begin();
    l_it++;
    /* l_it+=2; */
    cout<<"*l_it  "<<*l_it< 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<<"<<<<<<<<<<<<<<<<<::iterator d_it=num1.begin();
    d_it++;
    d_it+=2;
    cout<<"*d_it  "<<*d_it<

作业

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 lst; 
list::iterator iter1 = lst.begin(), iter2 = lst.end(); 
while(iter1 < iter2)
{    
     //....
}

list的迭代器不能进行<比较,要用迭代器特有的!=

04 创建和初始化vector的方法,每种都给出一个实例?当然也可以把deque与list写出来

01 创建空容器
02 count个value
03 迭代器
04 {}
05 拷贝构造和移动构造

#include 
#include 
#include 
#include 
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;


template 
void print( T & con){
    for(auto & ele: con){
        cout< num0;
    /*2*/vector num1(10,5);//count same value
    int arr[10]={0,1,2,3,4,5,6,7,8,9};
    /*3*/vector num2(arr,arr+10);//[0,10)
    /*4*/vector num4(num1);
    /*4*/vector num5(vector{1,2,3});
    /*5*/vector num3{4,5,6,3,2,7,3,9};
    print(num0);
    print(num1);
    print(num2);
    print(num3);
    print(num4);
    print(num5);
    cout< num0;
    /*2*/deque num1(10,5);//count same value
    /*3*/deque num2(num1.begin(),num1.end());//[0,10)
    /*4*/deque num4(num1);
    /*4*/deque num5(deque{1,2,3});
    /*5*/deque num3{4,5,6,3,2,7,3,9};
    print(num0);
    print(num1);
    print(num2);
    print(num3);
    print(num4);
    print(num5);
    cout< num0;
    /*2*/list num1(10,5);//count same value
    /*3*/list num2(num1.begin(),num1.end());//[0,10)
    /*4*/list num4(num1);
    /*4*/list num5(list{1,2,3});
    /*5*/list num3{4,5,6,3,2,7,3,9};
    print(num0);
    print(num1);
    print(num2);
    print(num3);
    print(num4);
    print(num5);
    cout<

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 
#include 
#include 
#include 
#include 
using std::cout;
using std::endl;
using std::vector;
using std::deque;
using std::ostream;

#define  PER_NUM 5
#define  SCO_NUM 10

class Person{
public:
//const char* 坏,终于知道为什么worning了
    Person(char* name,int sc)
        :_name(new char[strlen(name)+1]()),_score(sc)
    {
        strcpy(_name,name);
    }
    Person(const Person & p)
        :_name(new char[strlen(p._name)+1]()),_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[strlen(p._name)+1]();
            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< 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 sc;
        for(int j=0;jmax){max=ele;}
            if(ele
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;
class Person 
{
public:
	Person(string name,int score) 
    {
		this->m_name = name;
		this->m_score = score;
	}
	string m_name;
	int m_score;
};
void creatPerson(vector& v) {
	string nameSeed = "ABCDE";
	for (int i = 0; i < 5; i++) {
		string name = "选手";
		name += nameSeed[i];
		int score = 0;
		Person p(name,score);
		v.push_back(p);
	}
}
void setScore(vector& v)
{
	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		deque d;
		for (int i = 0; i < 10; i++) 
        {
			int score = rand() % 41 + 60;
			d.push_back(score);
		}
		sort(d.begin(), d.end());
		d.pop_front();
		d.pop_back();
		int sum = 0;
		for (deque::iterator dit = d.begin(); dit != d.end(); dit++) {
			sum += (*dit);
		}
		int avg = sum/d.size();
		
		it->m_score=avg;	
    }
}
void showScore(vector& v) 
{
	for (vector::iterator it = v.begin(); it != v.end(); it++) 
    {
		cout << "姓名:" << it->m_name << "平均分数:" << it->m_score << endl;
	}
	cout << endl;
}

int main() {
	srand((unsigned int)time(NULL));
	vector v;//定义Person类型的容器
	creatPerson(v);//创建五名选手,创建容器类里面的成员及其属性
	//for (vector::iterator it = v.begin(); it != v.end(); it++) {
	//	cout << "姓名:" << (*it).m_name << "分数:" << (*it).m_score << " ";
	//}
	//cout << endl;
	setScore(v);
	showScore(v);	

	return 0;
}

 不想看,虽然我的初始化一直woring
//Person(const char* name,int score)坏,终于知道为什么worning了

08 编程题:从一个 vector 初始化一个 string

提示:可以定义vector如下:vector vc = { 'H', 'E', 'L', 'L', 'O' };然后查看如何给string进行初始化或者赋值,考查对vector与string的基本使用

#include 
#include 
#include 
#include 
#include 
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;
using std::string;


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


void test(){
    vectorvc={'h','e','l','l','o'};
    string s1{'\0'};
    cout<
#include 
#include 
#include 
using namespace std;
int main()
{
	vector vc = { 'H', 'E', 'L', 'L', 'O' };
	string s(vc.data(), vc.size());
	cout << s << endl;
	

	return 0;
}

 我好蠢嘻嘻

09 题目:使用vector打印九九乘法表。

提示:可以使用vector嵌套vector的使用方式。例如:vector>,然后就是veector的基本操作。

#include 
#include 
#include 
#include 
#include 
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;
using std::string;

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

void print(vector>  & con){
    for(int i=0;i<9;i++){
        for(auto & ell : con[i]){
            cout<<(i+1)<<"×"<> v1(9);
    for(int i=0;i<9;i++){
        vector tempv;
        for(int j=0;j<=i;j++){
            tempv.push_back(j+1);
        }
        v1[i]=tempv;
    }
    print(v1);
}


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

using namespace std;
 
int main()
{
	vector >v2d;
	for (int i = 0; i < 9; i++)
	{
		v2d.push_back(vector());
	}
    
	for (int i = 0; i < v2d.size(); i++)
	{
		for (int j = 0; j <= i; j++)
		{
			v2d[i].push_back((i + 1) * (j + 1));
		}
	}
	for (int i = 0; i < v2d.size(); i++)
	{
		for (int j = 0; j < v2d[i].size(); j++)
		{
			cout << i + 1 << "*" << j + 1 << "=" << v2d[i][j] << "\t";
		}
		cout << endl;
	}
	return 0;
}

01,初始化9个空 vector-->vector>

02,vector存乘积

03,打印

你可能感兴趣的:(我爱学习,list,数据结构,c++)