news 2026/4/26 6:23:36

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 12:25:41

Day15 不平衡数据集的处理

浙大疏锦行 一、数据准备与基线模型 # 先运行之前预处理好的代码 import pandas as pd import pandas as pd #用于数据处理和分析&#xff0c;可处理表格数据。 import numpy as np #用于数值计算&#xff0c;提供了高效的数组操作。 import matplotlib.pyplot as plt…

作者头像 李华
网站建设 2026/4/26 1:59:11

如何快速掌握B站视频下载:DownKyi完整配置使用指南

如何快速掌握B站视频下载&#xff1a;DownKyi完整配置使用指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff…

作者头像 李华
网站建设 2026/4/18 8:01:39

11、Vim 文件操作与移动技巧全解析

Vim 文件操作与移动技巧全解析 1. 使用‘:find’按文件名打开文件 在 Vim 中,通常可以使用 :edit 命令通过提供完整路径来打开文件。但当项目中的文件嵌套在多个目录中时,每次都输入完整路径会很繁琐。这时, :find 命令就派上用场了,它允许我们仅通过文件名来打开文件…

作者头像 李华
网站建设 2026/4/20 6:51:57

24、Vim开发利器:ctags与Quickfix List的高效使用

Vim开发利器:ctags与Quickfix List的高效使用 在软件开发过程中,高效的代码导航和错误处理是提高开发效率的关键。Vim作为一款强大的文本编辑器,提供了丰富的工具和功能来满足这些需求。本文将介绍Vim中两个重要的功能:使用ctags进行代码索引和导航,以及利用Quickfix Lis…

作者头像 李华
网站建设 2026/4/20 4:52:03

VNote 笔记神器:快速上手与个性化配置指南

VNote 笔记神器&#xff1a;快速上手与个性化配置指南 【免费下载链接】vnote 项目地址: https://gitcode.com/gh_mirrors/vno/vnote 快速了解 VNote&#xff1a;你的专属 Markdown 笔记平台 项目核心亮点 VNote 是一款基于 Qt 框架开发的免费开源 Markdown 笔记应用…

作者头像 李华
网站建设 2026/4/18 7:37:35

Locale Emulator使用指南:三步解决软件区域兼容问题

Locale Emulator使用指南&#xff1a;三步解决软件区域兼容问题 【免费下载链接】Locale-Emulator Yet Another System Region and Language Simulator 项目地址: https://gitcode.com/gh_mirrors/lo/Locale-Emulator 还在为日文游戏乱码、韩文软件崩溃而烦恼吗&#xf…

作者头像 李华