0902,DEQUE,LIST,VECTOR

2024-09-04 08:12
文章标签 list vector deque 0902

本文主要是介绍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 valueint arr[10]={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[0]);++idx){cout<<num1[idx]<<" ";}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_tartcout<<&(*num3.begin())<<endl;cout<<&(num3[0])<<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 curdisplay_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 pointerdisplay_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 curdisplay(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 valueint arr[10]={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;#define  PER_NUM 5
#define  SCO_NUM 10class 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<<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[j]<<" "; */}/* 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[i].p_sc(rel); cout<<people[i]<<endl;}cout<<endl;
}
int main(void)
{test();return 0;
}
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <deque>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<Person>& 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<Person>& v)
{for (vector<Person>::iterator it = v.begin(); it != v.end(); it++){deque<int> 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<int>::iterator dit = d.begin(); dit != d.end(); dit++) {sum += (*dit);}int avg = sum/d.size();it->m_score=avg;	}
}
void showScore(vector<Person>& v) 
{for (vector<Person>::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<Person> v;//定义Person类型的容器creatPerson(v);//创建五名选手,创建容器类里面的成员及其属性//for (vector<Person>::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<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[i]){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[i]=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[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<int>-->vector<vector<int>>

02,vector<int>存乘积

03,打印

这篇关于0902,DEQUE,LIST,VECTOR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135475

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

处理List采用并行流处理时,通过ForkJoinPool来控制并行度失控的问题

在使用parallelStream进行处理list时,如不指定线程池,默认的并行度采用cpu核数进行并行,这里采用ForJoinPool来控制,但循环中使用了redis获取key时,出现失控。具体上代码。 @RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@Slf4jpublic class Fo

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对

List对象过滤

List materialInventoryList = materialInventories.stream().filter(mat -> mat.getQty().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList()); stream().filter()方法可以过滤掉List的数据

c++stack和list 介绍

stack介绍 堆栈是一种容器适配器,专门设计用于在 LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。 堆栈作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器 的类,提供一组特定的成员函数来访问其元素。元素从特定容器的 “back” 推送或弹出,这称为堆栈的顶部。 stack接口 stack() 构造空的栈 empty() 检测stack是否为