网站建设分几块,wordpress 好用的主题,wordpress默认登陆地址,wordpress 预览插件下载STL容器——vector容器
1.容器简介
将元素置于一个动态数组中加以管理的容器可以随机存取元素尾部添加或移除元素非常快速#xff0c;但是在中部或头部插入元素或移除元素比较费时常用API操作#xff1a;API就是应用程序编码接口#xff0c;也就是别人编号的程序提供给你使用…STL容器——vector容器1.容器简介将元素置于一个动态数组中加以管理的容器可以随机存取元素尾部添加或移除元素非常快速但是在中部或头部插入元素或移除元素比较费时常用API操作API就是应用程序编码接口也就是别人编号的程序提供给你使用就叫API。使用比人代码中的某个函数、类、对象就叫做使用了某个APIvoidPrintVector(vectorintv)//这里调用打印容器API{for(autox:v){coutx ;}coutendl;}2.vector对象的默认构造采用模板类实现默认构造形式vectorTvecT vectorintvecInt//一个存放int的vector容器vectorfloatvecInt//一个存放float的vector容器···classCA{};vectorCA*vecpCA//用于存放CA对象的指针的容器vectorCAvecCA//由于容器元素的存放是按值赋值的方式进行的所以此时CA必须提供 //CA的拷贝函数以抱枕发CA对象间拷贝正常3.vector对象的带参数构造vector(beg,end);//构造函数将[beg,end)区间中的元素拷贝给本身。注意区间是左闭右开vector(n,elem);//构造函数将n个elem拷贝到本身vector(const vector vec)intiArray[]{0,1,2,3,4};vectorintvecIntA(iArray,iArray5);//将五个参数存到容器A中vectorintvecIntB(vecIntA.begin(),vecIntA.end());vectorintvecIntB(vecIntA.begin(),vecIntA.end()3);vectorintvecIntC(3,9);//可以用for循环去验证 for (int i0;i 3;i)// cout vecIntC[3] ;// cout endl;vectorintvecIntD(vecIntA);//拷贝容器A4.vector 赋值vector.assign(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身。注意区间是左闭右开vector.assign(n,elem);//将n个elem拷贝到本身vector(const vector vec) //重载等号操作符vector.swap(vec);//将vec与本身的元素互换vectorintv2;//直接赋值v2v1;vectorintv3;v3.assign(v1.begin(),v1.end());5.插入和删除插入push_back()、insert() vector.insert(pos,elem); //在pos位置插入一个elem返回新数据的位置 vector.insert(pos,n,elem); //在pos位置插入n个elem数据无返回值 vector.insert(pos,beg,end); //在pos位置插入[beg, end)区间的数据无返回值删除pop_back()、erase()vectorintv;//尾插v.push_back(10);v.push_back(20);PrintVector(v);//尾删v.pop_back();intb[]{40,50,60,70,80,90};//将指定的区间中的元素插入到指定的位置v1.insert(v1.begin()7,b1,b5);//插入 - 提供迭代器v.insert(v.begin(),100);//注意第一个参数不能为下标应该为指针//重载v.insert(v.begin(),2100);//删除v.erase(v.begin());6.vector的容量和大小vector.capacity(); //容量大小vector.size(); //返回容器中元素的个数vector.empty(); //判断容器是否为空vector.resize(num); //重新制定容器的长度为num,若容器变长则以默认值填充新位置。如果容器变短则末尾超出容器长度的元素被删除。vector.resize(num,elem); //重新制定容器的长度为num若容器变长则以elem值填充新的位置。如果容器变短则末尾超出容器长度的元素被删除。int iArry[] {0,1,2,3,4}; vectorint v1; v1.assign(iArray, iArray 5); if (v1.empty()) { cout 容器为空 endl; } else { cout 容器不为空 endl; cout vector容器的容量为 v.capacity() endl; cout vector容器的大小: v.size() endl; }7.vector元素的访问方式vec.at(idx); //返回索引idx所指的数据如果idx越界抛出out_of_range异常vec[idx]; //返回索引idx所指的数据越界时运行直接报错inta[]{1,2,3,4};vectorintv1(a,a4);for(i0;iv1.size();i)coutv1[i] ;coutendl;v1[8]100//下标越界会导致程序异常截至v1.at(n:8)100;使用下面的函数会帮助我们找出错误在终端会输出’std::out_of_range’迭代器1.迭代器的基本概念迭代器是一种检查容器内元素并且遍历容器内元素的数据类型作用是提供对一个容器中对象的访问方法并且定义了容器中对象的范围迭代器统一了对所有容器的访问方式vector容器的iterator类型 属于随机访问迭代器一次可以移动多个位置vectorint::iterator it;//变量名为it需求案例有五位参赛选手参加挑战赛比赛评委有十位十位评委依次对每位参赛选手进行打分去掉一个最高分和最低分取平均分即为每位选手的最终比赛得分主要涉及内容类的使用、vector和deque容器的使用、sort排序算法以及随机数rand函数的综合运用案例步骤1创建选手类(Player)成员属性包括选手姓名(name_)和选手最终得分(final_score_)2创建五位选手放在vector容器中定义一个存放所有选手的容器(players)创建一个创建选手的函数(createPlayer)用于将每位选手放入vector容器中函数参数要传入每个选手类对象的引用通过for循环遍历存放五个选手3创建一个评委打分函数(judgesScore)用引用的方式传入存放所有选手的容器(players)通过迭代器遍历容器players并将每个评委的得分放入deque容器中十个评委的得分随机选取评分在60-100分之间对这十个分数通过sort算法排序去除最高分和最低分因为得分放入到deque容器中最低分通过头删最高分通过尾删即可对deque进行遍历求解总分并求解平均分即可将平均分赋值给对应的选手即可4创建一个显示每个选手最终得分的函数(showScore)Deque和Vector容器实例代码创建类classPlayer{public:Player(conststd::string name,intscore){this-namename;//this是一个指向当前对象的指针this-scorescore;}std::stringgetName()const{returnthis-name;}intgetScore()const{returnthis-score;}voidsetScore(intscore){this-scorescore;}private://private是访问控制符表示以下成员只能在类的内部访问std::string name;intscore;};1.创建选手函数void createPlayers(vectorPlayer p) { //传引用避免拷贝开销 string namelist ABCDE; for (int i 0; i 5; i) { std::string name Player ; name namelist[i]; //运算符重载追加字符串方法 int score 0; //初始分数为0 Player player(name, score); // p.push_back(player); //将player对象添加到vector容器中 } }2.评委打分函数void judgeScore(vectorPlayer p) { for (std::vectorPlayer::iterator it p.begin(); it ! p.end(); it) { //容器的遍历只能同构迭代器操作每个选手 std::dequeint scores; //使用双端队列存储每个选手的得分 int sum_score 0; int aver_score 0; for (int i 0; i 10; i) { int score rand() % 41 60; //060 - 4060[0,100] scores.push_back(score); } sort(scores.begin(), scores.end()); //排序 scores.pop_front(); //去掉最低分 scores.pop_back(); //去掉最高分 for (std::dequeint::iterator dit scores.begin(); dit ! scores.end(); dit) { sum_score *dit; //累加剩余分数 } aver_score sum_score / scores.size(); it-setScore(aver_score); } }3.显示最终得分函数void showScore(const vectorPlayer p) { for (std::vectorPlayer::const_iterator it p.begin(); it ! p.end(); it) { cout Name: it-getName() \tScore: it-getScore() endl; } }整体函数#include iostream #include vector #include algorithm #include ctime #include deque #include string using namespace std; class Player { public: Player(const std::string name, int score) { this-name name; //this是一个指向当前对象的指针 this-score score; } std::string getName() const { return this-name; } int getScore() const { return this-score; } void setScore(int score) { this-score score; } private: //private是访问控制符表示以下成员只能在类的内部访问 std::string name; int score; }; void createPlayers(vectorPlayer p) { //传引用避免拷贝开销 string namelist ABCDE; for (int i 0; i 5; i) { std::string name Player ; name namelist[i]; //运算符重载追加字符串方法 int score 0; //初始分数为0 Player player(name, score); // p.push_back(player); //将player对象添加到vector容器中 } } void judgeScore(vectorPlayer p) { for (std::vectorPlayer::iterator it p.begin(); it ! p.end(); it) { //容器的遍历只能同构迭代器操作每个选手 std::dequeint scores; //使用双端队列存储每个选手的得分 int sum_score 0; int aver_score 0; for (int i 0; i 10; i) { int score rand() % 41 60; //060 - 4060[0,100] scores.push_back(score); } sort(scores.begin(), scores.end()); //排序 scores.pop_front(); //去掉最低分 scores.pop_back(); //去掉最高分 for (std::dequeint::iterator dit scores.begin(); dit ! scores.end(); dit) { sum_score *dit; //累加剩余分数 } aver_score sum_score / scores.size(); it-setScore(aver_score); } } void showScore(const vectorPlayer p) { for (std::vectorPlayer::const_iterator it p.begin(); it ! p.end(); it) { cout Name: it-getName() \tScore: it-getScore() endl; } } int main() { srand((unsigned int)time(NULL)); //设置随机数种子,确保每次运行结果不同 std::vectorPlayer players; //存放五位选手 createPlayers(players); //创建选手 judgeScore(players); //评委打分 showScore(players); //显示最终得分 return 0; }