目录
04 创建和初始化vector的方法,每种都给出一个实例?当然也可以把deque与list写出来
05 如果c1与c2是两个容器,下面的比较操作有什么限制?if(c1 < c2)
07 评委打分的例子:要求:有五名选手ABCDE,10个评委打分,去掉最高分和最低分,求出每个选手的平均分。
08 编程题:从一个 vector 初始化一个 string。
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 <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,打印