news 2025/12/30 8:13:38

STL容器——vector容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STL容器——vector容器

STL容器——vector容器

1.容器简介

  • 将元素置于一个动态数组中加以管理的容器
  • 可以随机存取元素
  • 尾部添加或移除元素非常快速,但是在中部或头部插入元素或移除元素比较费时
  • 常用API操作:API就是应用程序编码接口,也就是别人编号的程序提供给你使用就叫API。使用比人代码中的某个函数、类、对象,就叫做使用了某个API
voidPrintVector(vector<int>&v)//这里调用打印容器API{for(autox:v){cout<<x<<" ";}cout<<endl;}

2.vector对象的默认构造

采用模板类实现,默认构造形式

vector<T>vecT vector<int>vecInt//一个存放int的vector容器vector<float>vecInt//一个存放float的vector容器···classCA{};vector<CA*>vecpCA//用于存放CA对象的指针的容器vector<CA>vecCA//由于容器元素的存放是按值赋值的方式进行的,所以此时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};vector<int>vecIntA(iArray,iArray+5);//将五个参数存到容器A中vector<int>vecIntB(vecIntA.begin(),vecIntA.end());vector<int>vecIntB(vecIntA.begin(),vecIntA.end()+3);vector<int>vecIntC(3,9);//可以用for循环去验证 for (int i=0;i <3;i++)// cout << vecIntC[3] << " ";// cout << endl;vector<int>vecIntD(vecIntA);//拷贝容器A

4.vector 赋值

  • vector.assign(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身。注意区间是左闭右开
  • vector.assign(n,elem);//将n个elem拷贝到本身
  • vector(const vector &vec) //重载等号操作符
  • vector.swap(vec);//将vec与本身的元素互换
vector<int>v2;//直接赋值v2=v1;vector<int>v3;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()
vector<int>v;//尾插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,b+1,b+5);//插入 - 提供迭代器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}; vector<int> 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};vector<int>v1(a,a+4);for(i=0;i<v1.size();i++)cout<<v1[i]<<" ";cout<<endl;v1[8]=100//下标越界会导致程序异常截至v1.at(n:8)=100;

使用下面的函数,会帮助我们找出错误,在终端会输出’std::out_of_range’

迭代器

1.迭代器的基本概念

  • 迭代器是一种检查容器内元素并且遍历容器内元素的数据类型
  • 作用是提供对一个容器中对象的访问方法,并且定义了容器中对象的范围

迭代器统一了对所有容器的访问方式

vector容器的iterator类型 属于随机访问迭代器:一次可以移动多个位置

vector<int>::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->name=name;//this是一个指向当前对象的指针this->score=score;}std::stringgetName()const{returnthis->name;}intgetScore()const{returnthis->score;}voidsetScore(intscore){this->score=score;}private://private是访问控制符,表示以下成员只能在类的内部访问std::string name;intscore;};

1.创建选手函数

void createPlayers(vector<Player>& 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(vector<Player>& p) { for (std::vector<Player>::iterator it = p.begin(); it != p.end(); ++it) { //容器的遍历只能同构迭代器操作每个选手 std::deque<int> scores; //使用双端队列存储每个选手的得分 int sum_score = 0; int aver_score = 0; for (int i = 0; i < 10; i++) { int score = rand() % 41 + 60; //0+60 - 40+60,[0,100] scores.push_back(score); } sort(scores.begin(), scores.end()); //排序 scores.pop_front(); //去掉最低分 scores.pop_back(); //去掉最高分 for (std::deque<int>::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 vector<Player>& p) { for (std::vector<Player>::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(vector<Player>& 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(vector<Player>& p) { for (std::vector<Player>::iterator it = p.begin(); it != p.end(); ++it) { //容器的遍历只能同构迭代器操作每个选手 std::deque<int> scores; //使用双端队列存储每个选手的得分 int sum_score = 0; int aver_score = 0; for (int i = 0; i < 10; i++) { int score = rand() % 41 + 60; //0+60 - 40+60,[0,100] scores.push_back(score); } sort(scores.begin(), scores.end()); //排序 scores.pop_front(); //去掉最低分 scores.pop_back(); //去掉最高分 for (std::deque<int>::iterator dit = scores.begin(); dit != scores.end(); ++dit) { sum_score += *dit; //累加剩余分数 } aver_score = sum_score / scores.size(); it->setScore(aver_score); } } void showScore(const vector<Player>& p) { for (std::vector<Player>::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::vector<Player> players; //存放五位选手 createPlayers(players); //创建选手 judgeScore(players); //评委打分 showScore(players); //显示最终得分 return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/23 18:28:59

文件流详解、应用场景及代码案例(AI)

文件流&#xff08;File Stream&#xff09;是计算机编程中用于按顺序读写文件数据的一种抽象机制&#xff0c;它将文件的操作抽象为“流”的形式&#xff0c;数据如同水流一样从源&#xff08;文件&#xff09;到程序&#xff0c;或从程序到目标&#xff08;文件&#xff09;&…

作者头像 李华
网站建设 2025/12/25 0:05:23

CSP-J教程——第一阶段第九、十课:数组与字符串

课程目标 理解数组的概念和用途掌握一维数组的定义、初始化和访问学会数组遍历和经典应用掌握字符串的基本操作理解批量数据处理的思想为后续算法学习打下基础 第一部分&#xff1a;数组的概念&#xff08;40分钟&#xff09; 1.1 什么是数组&#xff1f; 生活比喻&#xff…

作者头像 李华
网站建设 2025/12/24 15:43:44

Windows文件资源管理器美化终极指南:5步实现Mica模糊效果

Windows文件资源管理器美化终极指南&#xff1a;5步实现Mica模糊效果 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/ExplorerBlurMica …

作者头像 李华
网站建设 2025/12/24 12:50:12

大数据建模中的模型

在大数据建模中&#xff0c;“模型”一词通常指的是对数据结构、数据关系或数据行为的抽象表示。根据建模目的和应用场景的不同&#xff0c;可以将模型分为多种类型&#xff0c;常见的包括物理模型、概念模型、逻辑模型、理论模型、统计模型、机器学习模型、预测模型、仿真模型…

作者头像 李华
网站建设 2025/12/25 7:58:21

LangGraph入门指南:从零掌握大模型应用的状态管理与流程编排!

简介 文章介绍了LangGraph框架&#xff0c;这是一个专为构建复杂LLM应用设计的低层级编排框架。它通过State(状态)、Node(节点)和Edge(边缘)三个核心组件实现有状态、多步骤、长周期运行的Agent应用。LangGraph提供持久执行、动态控制流和人工介入等特性&#xff0c;支持分支、…

作者头像 李华
网站建设 2025/12/24 11:51:52

C语言中以坐标的方式图解“字母金字塔”的绘制

目录题目题目解析题目理解空格图-坐标解析字母递增图-坐标解析字母递减图-坐标解析代码汇总验证代码汇总终端运行验证坐标图解法的好处建议好处题目 实现字母金字塔&#xff0c;通过键盘输入字符来控制层数&#xff0c;如输入D&#xff0c;则打印下面图形 AABAABCBAABCDCBA题目…

作者头像 李华