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; }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1027656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

22、Mozilla开发中的环境与文件处理

Mozilla开发中的环境与文件处理 1. 环境变量的获取与检测 在Mozilla开发中,当前运行进程的环境变量可以通过特定的组件和接口逐个获取。使用的组件和接口为 @mozilla.org/process/util;1 interface nsIProcess 。 nsIProcess 接口有一个 getEnvironment() 方法,它可以…

16、深入探索XBL绑定:增强用户界面开发的利器

深入探索XBL绑定:增强用户界面开发的利器 1. XBL绑定简介 XBL(XML Binding Language)是一种基于XML的语言,专门用于Mozilla平台。它允许开发者向XUL、HTML和XML中添加全新且功能完备的标签,是创建新GUI小部件的高效系统。与普通的XUL用户自定义标签不同,XBL能够创建具有…

一段代码带你理解输入缓冲区

本文将多次使用C语言中的scanf与getchar函数&#xff0c;带你充分理解输入缓冲区。#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {/*int chgetchar();//从输入缓冲区获取一个字符&#xff0c;返回值类型是int//错误输入时返回EOF&#xff08;end of …

人工智能在健康医疗软件中的应用

人工智能在健康医疗软件中的应用关键词&#xff1a;人工智能、健康医疗软件、医疗诊断、疾病预测、医疗影像分析摘要&#xff1a;本文深入探讨了人工智能在健康医疗软件中的应用。首先介绍了相关背景&#xff0c;包括目的范围、预期读者等内容。接着阐述了人工智能与健康医疗软…

LobeChat多语言支持现状与国际化适配方案

LobeChat多语言支持现状与国际化适配方案 在构建现代AI聊天应用的今天&#xff0c;一个看似基础却极易被低估的问题正悄然影响着全球用户的体验——你有没有遇到过这样的场景&#xff1a;一位德国用户打开对话界面&#xff0c;发现按钮上写着“New Chat”&#xff0c;而提示语却…

BetterNCM插件:网易云音乐终极增强方案

还在忍受网易云音乐原版客户端的各种限制吗&#xff1f;&#x1f914; BetterNCM插件将彻底改变你的音乐体验&#xff01;这款强大的增强工具通过一键式安装程序&#xff0c;为你带来前所未有的个性化音乐世界。 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 …

17、探索 Mozilla 的 XPCOM 对象

探索 Mozilla 的 XPCOM 对象 1. Mozilla 平台与 XPCOM 组件概述 Mozilla 平台是构建软件应用程序的基础,它包含一个拥有超过一千个对象的对象库,其中许多对象与图形用户界面(GUI)无关。该平台的对象库主要由 XPCOM 组件组成。 1.1 XPCOM 组件的作用 如果没有 XPCOM 组件…

3大实用技巧深度解析:BetterNCM安装器故障排查与性能优化指南

3大实用技巧深度解析&#xff1a;BetterNCM安装器故障排查与性能优化指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 当你在安装BetterNCM插件时遇到各种技术障碍&#xff0c;这往…

5步搞定SillyTavern版本升级:告别烦恼的完整指南

5步搞定SillyTavern版本升级&#xff1a;告别烦恼的完整指南 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 还在为软件升级而头疼吗&#xff1f;担心升级过程中数据丢失、配置混乱&#x…

实验(三)

实验目的&#xff1a;通过对目标靶机的渗透过程&#xff0c;了解CTF竞赛模式&#xff0c;理解CTF涵盖的知识范围&#xff0c;如MISC、PPC、WEB等&#xff0c;通过实践&#xff0c;加强团队协作能力&#xff0c;掌握初步CTF实战能力及信息收集能力。熟悉网络扫描、探测HTTP web服…

16、深入了解Linux存储与设备管理

深入了解Linux存储与设备管理 RAID示例 在一个简单的RAID配置里,有三个RAID设备,利用两块硬盘上对应的分区来设置 /boot 、 /root 和 /home 分区。由于系统只能从RAID 1设备启动,而不能从RAID 5启动,所以 /boot 分区被配置为RAID 1设备,其他分区则采用更常用的R…

18、Mozilla开发中的命名规范与模块化编程

Mozilla开发中的命名规范与模块化编程 1. 接口前缀与类型报告 在开发中,接口前缀用于标识可供应用程序程序员使用的接口。例如, fix 用于此目的,此外还有 imgI 、 inI 、 jsdI 和 mozI 等前缀,它们分别对应图像、检查器、JavaScript 调试器和 Mozilla 相关,这…

如何获取美股实时行情:Python 量化交易指南

在量化交易领域&#xff0c;美股实时行情数据是构建高效交易策略的核心要素。通过实时 Tick、实时报价、美股历史 K 线、美股历史数据等信息&#xff0c;交易者可以实现精准的市场分析和决策。本文将介绍如何利用股票数据 API、股票数据接口、金融 API、金融行情数据 API 以及股…

PHP 常量

PHP 常量 PHP 是一种广泛使用的开源服务器端脚本语言,它拥有丰富的内置常量和预定义常量,这些常量在编程中扮演着重要角色。本文将详细介绍 PHP 中的常量及其应用。 1. 常量的概念 在 PHP 中,常量是一段不可改变的值,一旦定义后,其值不能被修改。常量通常用于存储那些不…

Chrome搜索替换插件终极指南:免费高效的网页文本批量处理神器

Chrome搜索替换插件终极指南&#xff1a;免费高效的网页文本批量处理神器 【免费下载链接】chrome-extensions-searchReplace 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-searchReplace 还在为网页文本修改而烦恼吗&#xff1f;chrome-extensions…

15、深入探索Vim寄存器:复制粘贴的高级技巧

深入探索Vim寄存器:复制粘贴的高级技巧 1. 复制粘贴初体验与问题发现 在Vim中进行复制粘贴操作时,可能会遇到意想不到的情况。例如,我们先使用 yiw 复制了单词 “collection”,之后执行 diw 删除了另一个单词 “somethingInTheWay”,再使用 P 命令粘贴时,预期粘贴…

基于C#的FTP客户端实现方案

基于C#的FTP客户端实现方案&#xff0c;整合了多种协议特性和工程优化&#xff0c;支持文件传输、目录操作及异常处理&#xff1a;一、核心类实现&#xff08;支持被动模式/二进制传输&#xff09; using System; using System.IO; using System.Net; using System.Net.Sockets…

16、Vim 复制粘贴与宏操作技巧全解析

Vim 复制粘贴与宏操作技巧全解析 1. 复制粘贴基础及系统剪贴板交互 在 Vim 中,复制和粘贴操作是常见的文本处理需求。 p 和 P 命令在粘贴多行文本区域时表现出色,但对于短字符文本, <C - r>{register} 映射更为直观。 当涉及与系统剪贴板交互时,除了 Vim 内…

springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题

Spring Boot 项目从 JDK 8 升级到 JDK 21&#xff08;长期支持版 LTS&#xff09;&#xff0c;会面临哪些问题。 主要就是API变更、框架适配、第三方依赖、构建工具配置 问题。springboot项目从1.8到21面临的问题一、JDK API 变更导致的问题JDK 8 到 21 有大量 API 废弃、移除或…

Linux学习日记21:读写锁

一、前言前面我们学习了死锁的相关知识&#xff0c;今天我们来学习读写锁的相关知识。二、读写锁读写锁是 Linux 系统中一种支持并发读、独占写的同步机制&#xff0c;核心设计目标是提高读多写少场景下的并发性能&#xff0c;解决互斥锁&#xff08;mutex&#xff09;在多读场…