C++之vector

1、vector概念

功能:vector的功能和数组非常相似,可以看成是一个升级版的数组。
vector和普通数组的区别:
        (1)数组是静态的,长度不可改变,而vector可以动态扩展,增加长度。
        (2)数组内数据通常存储在栈上,而vector中数据存储在堆上。
动态扩展并不是在原空间之后续接新空间,而是找到比原来更大的内存空间,将原数据拷贝到新空间,释放原空间。

2、vector库函数

2.1、构造函数

函数原型:
(1)vector<DataType> vec ;                            //使用模板类,默认构造函数
(2)vector(vec.begin(),vec.end());                //将[v.begin(),v.end())区间中的元素拷贝给本身
(3)vector(n, elem);                                         //将n个elem拷贝给本身
(4)vector(const vector &vec) ;                     //拷贝构造函数

2.2、赋值操作

函数原型:
(1)vector& operator=(const vector &vec);         //重载赋值运算符
(2)assign(vec.begin(), vec.end());                      //将[v.begin(),v.end())区间中的元素赋值给本身
(3)assign(n, elem);                                               //将n个elem赋值给本身

2.3、属性操作

函数原型:
(1)empty();                                    //判断容器是否为空,为空返回1,否则返回0
(2)capacity();                                //返回容器的容量
(3)size();                                        //返回容器的大小,即容器中元素的个数
(4)resize(int num);                       //重新指定容器的长度为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
(5)resize(int num, int elem);       //重新指定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超过容器长度的元素被删除

2.4、增加、删除

函数原型:
(1)push_back(ele);                                   //尾部插入元素ele
(2)pop_back();                                         //删除最后一个元素
(3)insert(const_iterator pos, ele);         //在迭代器指向的位置pos处插入一个元素ele
(4)insert(const_iterator pos, int count, ele);    //在迭代器指向的位置pos处插入count个元素ele
(5)erase(const_iterator pos);                //删除迭代器指向的元素
(6)erase(const_iterator begin, const_iterator end);     //删除迭代器从begin到end之间的元素
(7)clear();                                                //删除容器中所有元素

2.5、vector数据存取

函数原型:
(1)at(int idx);               //返回索引idx所指的数据
(2)operator[];        //返回[]内索引所指的数据
(3)front();           //返回容器中第一个元素
(4)back();                         //返回容器中最后一个元素

2.6、互换

函数原型:
(1)swap(v);           //容器v和当前容器互换

2.7、预留空间

功能:减少vector在动态扩容时的扩展次数;每次使用push_back(v)时,如果容器v的大小要超过v的容量时,系统就会对v进行一次动态扩容,至于扩大多少空间,由系统决定。
函数原型:
(1)reserve(int len);          //容器预留len个元素长度,也就是把容量扩为len,预留的位置并不初始化,同时也不可访问

2.8、data()函数

        std::vector::data() 是 C++ 中的STL库函数,它返回一个指向内存数组的直接指针,该内存数组由向量内部用于存储其拥有的元素。

vector_name.data()

参数:该函数不接受任何参数。

返回值:该函数返回一个指向数组中第一个元素的指针,该指针在向量内部使用。

#include <iostream>
#include <vector>int main()             
{std::vector<int> myvector(5);int *p = myvector.data();*p = 10;++p;*p = 20;p[2] = 100;std::cout << "myvector contains:";for (unsigned i = 0; i < myvector.size(); ++i)std::cout << ' ' << myvector[i];std::cout << std::endl;return 0;
}

结果为:

myvector contains: 10 20 0 100 0

3、迭代器(容器通用)

        迭代器(iterator)是一种用于遍历数据集合的的对象。它提供了一种访问数据集合中元素的方式,而无需暴露数据集合内部的细节。使用迭代器,我们可以对数据集合中的每个元素进行处理,而无需将整个数据集合加载到内存中。这样可以节省内存空间,并且在处理大型数据集合时可以提高处理效率。

分类:

(1)前向迭代器  vector<int>::iterator

(2)只读迭代器  vector<int>::const_iterator

(3)逆向迭代器  vector<int>::reverse_iterator

(4)输入迭代器  istream_iterator<int>

(5)输出迭代器  ostream_iterator<int>

函数:

(1)begin()       返回指向容器的第一个元素的迭代器

(2)end()         返回指向容器的末尾值EOF的迭代器,即最后元素的下一个位置

(3)rbegin()    返回reverse iterator(end()),一个逆向迭代器,指向反序后的首元素

(4)rend()       返回reverse_iterator(begin()),一个逆向迭代器,指向反序后的尾元素,即首元素的前一个位置

C++ STL 迭代器:

        C++ STL(标准模板库)中的容器类都提供了迭代器,用于访问容器内部的元素。迭代器是一个类或者一个指针,它可以指向容器中的一个元素,然后遍历容器中的所有元素。

C++ STL中的迭代器通常具有以下五个成员函数:

(1)operator*()                                          用于返回当前迭代器指向的元素的引用。
(2)operator->()                                       用于返回当前迭代器指向的元素的指针。
(3)operator++()                                       用于将迭代器移动到下一个元素。
(4)operator--()                                        用于将迭代器移动到上一个元素。
(5)operator==() 和 operator!=()            用于比较两个迭代器是否相等。

vector迭代器使用例子:

// 正向迭代器遍历
#include<iostream>
#include<vector>
using namespace std;
int main() {vector<int> v = { 1,2,3,4,5 };vector<int>::iterator it;for (it = v.begin(); it != v.end(); ++it) {cout << *it << " ";}return 0;
}
// 反向迭代器遍历
#include<iostream>
#include<vector>
using namespace std;
int main() {vector<int> v = { 1,2,3,4,5 };vector<int>::reverse_iterator it;for (it = v.rbegin(); it != v.rend(); ++it) {cout << *it << " ";}return 0;
}
// 使用auto关键字来简化迭代器
#include<iostream>
#include<vector>
using namespace std;
int main() {vector<int> v = { 1,2,3,4,5 };for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";}return 0;
}

4、示例

#include <vector>
#include <iostream>
using namespace std;void print_vector(vector<int> v)
{cout << "vector: ";for (auto it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}int main()
{vector<int> vec1;vec1.push_back(11);vec1.push_back(19);vec1.push_back(140);vec1.push_back(6);vec1.push_back(1);vec1.push_back(22);vec1.push_back(33);vec1.push_back(44);vec1.push_back(55);print_vector(vec1);vector<int> vec2(10, 9999);print_vector(vec2);vector<int> vec3(vec1.begin() + 4, vec1.end());print_vector(vec3);vector<int> vec4;vec4.resize(156);cout << "vec4 size: " << vec4.size() << endl;swap(vec1, vec2);print_vector(vec1);print_vector(vec2);return 0;
}

结果为:

vector: 11 19 140 6 1 22 33 44 55
vector: 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999
vector: 1 22 33 44 55
vec4 size: 156
vector: 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999
vector: 11 19 140 6 1 22 33 44 55

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

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

相关文章

协议和序列化反序列化

“协议”和序列化反序列化 “协议”的概念&#xff1a; “协议”本身是一种约定俗成的东西&#xff0c;由通讯双方必须共同遵从的一组约定&#xff0c;因此我们一定要将这种约定用计算机语言表达出来&#xff0c;此时双方计算机才能识别约定的相关内容 我们把这个规矩叫做“…

机器学习|决策树

左图的点是一种线性不可分的情况&#xff0c;无法拿一条直线去将进行分开。 每一个节点都代表一个决策&#xff0c;从而导致节点的分流。 最终的目标肯定是要达到分类。 但取得目标的过程是有所谓的好坏。 而这个好坏用熵/信息增益来衡量。 熵是一种用于反映系统混乱程度的物理…

思科网络设备监控

思科是 IT 行业的先驱之一&#xff0c;提供从交换机到刀片服务器的各种设备&#xff0c;以满足中小企业和企业的各种 IT 管理需求。管理充满思科的 IT 车间涉及许多管理挑战&#xff0c;例如监控可用性和性能、管理配置更改、存档防火墙日志、排除带宽问题等等&#xff0c;这需…

Makefile从入门到项目编译实战(学习笔记)

1.make和makefile介绍 1. make make 是一个应用程序&#xff0c;位于 /usr/bin/make 目录下&#xff0c;make 有如下的功能&#xff1a; &#xff08;1&#xff09;解析源程序之间的依赖关系 &#xff08;2&#xff09;根据依赖关系自动维护编译工作 &#xff08;3&#xff09…

Jmeter插件PerfMon Metrics Collector安装使用及报错解决

Jmeter作为一个轻量级的性能测试工具&#xff0c;开源、小巧、灵活的特性使其越来越受到测试人员喜爱。在实际的项目中&#xff0c;特别是跨地区项目&#xff0c;排除合作方指定要求使用Loadrunner作为性能测试工具外&#xff0c;Jmeter会是首选。 本篇文章&#xff0c;就着重…

Python 全栈系列226 GlobalBuffer

说明 为了简化开发程序&#xff0c;特别是需要依赖全局数据的程序&#xff0c;例如&#xff1a;分布式任务需要知道当前可处理的任务&#xff1b;定时程序需要依据某个约束性全局变量。一个附带的好处是会大量减少对数据库产生的请求。 GlobalBuffer的代价并不高&#xff1a;…

基于C++的http通信记录,使用httplib,Windows环境,vscode,mingw

使用了 httplib库&#xff0c;链接&#xff0c;使用该库只需要包含头文件即可&#xff0c;另外在Windows环境下&#xff0c;使用mingw构建项目&#xff0c;需要在编译时链接网络编程库&#xff0c;task.json如下&#xff1a; {"version": "2.0.0","t…

【MATLAB源码-第149期】基于MATLAB的2ASK,2FSK,2PSK,2DPSK等相干解调仿真,输出各节点波形。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 2ASK&#xff08;二进制幅移键控&#xff09;、2FSK&#xff08;二进制频移键控&#xff09;、2PSK&#xff08;二进制相移键控&#xff09;和2DPSK&#xff08;二进制差分相移键控&#xff09;是数字调制技术中的基本调制方…

汽车三元催化器的废品项目详解,三元催化再生项目的回收技术教学

一、教程描述 这是一个收废品项目&#xff0c;就收那些别人不懂的&#xff0c;三元催化器的附加值高&#xff0c;只要掌握技术&#xff0c;怎么玩都行的&#xff0c;只是要放得下你的面子。三元催化器&#xff0c;是安装在汽车排气系统中最重要的机外净化装置&#xff0c;它可…

MATLAB环境基于全局和局部多特征融合的红外图像分割主动轮廓模型

红外图像是一种热图像&#xff0c;不受光照影响&#xff0c;在光照条件差、有烟雾遮挡的环境中&#xff0c;可以辅助或代替可见光成像在各个领域中应用&#xff0c;同时作为热成像&#xff0c;对景物的热辐射敏感&#xff0c;在安全监测、质量检验等领域具有优势。在以下几个方…

Apache Doris Sink Connector部署指南

在当今数据驱动的时代&#xff0c;如何高效、准确地处理和分析大数据成为了各行各业面临的共同挑战。Apache Doris&#xff0c;作为一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;为大规模数据分析提供了强大的支持。 在当今数据驱动的时代&#xff0c;如何高效、…

CSS的弹性布局

CSS 的弹性布局 前言 前端中为了实现页面的布局效果&#xff0c;采用的一个技术手段&#xff0c;它在前端开发的技术场景是非常广泛的 实现上述区域的页面相关的布局效果&#xff0c;就可以使用弹性布局来完成 弹性布局(flex布局) flex 是 flexible box 的缩写&#xff0c;…

MongoDB聚合运算符:$cos

文章目录 语法使用举例余弦值角度余弦值弧度 $cos聚合运算符用来计算余弦值&#xff0c;返回指定表达式的余弦值。 语法 { $cos: <expression> }<expression>为可被解析为数值的表达式$cos返回弧度&#xff0c;使用$radiansToDegrees运算符可以把弧度转换为角度$…

现代企业架构框架——应用架构

现代企业架构框架——应用架构。 现代企业架构中的应用架构是指企业在构建和维护应用系统时所采用的一种架构框架。应用架构旨在实现应用系统的可扩展性、灵活性、可维护性和可重用性,以满足企业在数字化时代对应用系统的快速交付和持续创新的需求。下面将详细介绍应用架构的…

文生视频基础1:sora技术报告学习

sora技术报告学习 背景学后理解训练流程技术拆解编码解码扩散模型训练用数据 28号直播交流会后的一些想法自身的一点点想法 参考 原文地址&#xff1a;Video generation models as world simulators 背景 此项目的背景是基于Datawhale的关于sora技术文档的拆解和相关技术讲解…

GEE入门篇|图像处理(二):在Earth Engine中进行波段计算

目录 波段计算 1.NDVI的计算 2.NDVI 归一化差值的单次运算计算 3.使用 NDWI 的归一化差值 波段计算 许多指数可以使用 Earth Engine 中的波段运算来计算。 波段运算是对图像中两个或多个波段进行加、减、乘或除的过程。 在这里&#xff0c;我们将首先手动执行此操作&#x…

mac 终端 任何命令都运行不了了

特殊情况 记录一下 mac 配置是发生错误 导致几乎所有命令都运行不了了 下面解决方案 这可能是由于你的 PATH 没有设置正确&#xff0c;或者 .bash_profile 或 .zshrc 文件中存在语法错误。你可以尝试以下方法来解决这个问题&#xff1a; 打开一个新的终端窗口。 通过输入 /bin…

Redis第6讲——主从复制模式详解

Redis的读写性能很高&#xff0c;但在面对大规模数据和高发访问的挑战时&#xff0c;单节点的Redis可能无法满足需求&#xff0c;这就引出了Redis集群的概念。本节先介绍一下Redis高可用方案之一的主从复制模式&#xff0c;虽说现在基本不会用这种模式&#xff0c;但是无论是哨…

特征值和特征向量及其在机器学习中的应用

特征值和特征向量是线性代数中的概念&#xff0c;用于分析和理解线性变换&#xff0c;特别是由方阵表示的线性变换。它们被用于许多不同的数学领域&#xff0c;包括机器学习和人工智能。 在机器学习中&#xff0c;特征值和特征向量用于表示数据、对数据执行操作以及训练机器学…

掌握电子邮件的未来:深入解析IMAP4的革命性特性与实践

IMAP4基本概念 Internet Message Access Protocol, Version 4 (IMAP4) 是一种广泛使用的邮件获取协议&#xff0c;它允许邮件客户端访问和操作远程邮件服务器上存储的邮件信息。IMAP4是IMAP协议的最新版本&#xff0c;提供了更加丰富的邮件处理功能&#xff0c;如邮件搜索、标…