马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目次
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[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_tart
- cout<<&(*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 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[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 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<<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 <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[idx];
- 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)
- {
- //将分数设定在[60, 100]范围中
- 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[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,打印
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |