C++初阶——vector

一、什么是vector

        vector是表示可变大小的数组的序列容器,就像数组一样,vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效,但是它的大小是动态可变的,并且它的大小会被容器自动处理

二、vector的构造

        常用的构造函数:

构造函数声明接口声明
vector()无参构造函数
vector(size_type n, const value_type& val=value_type())构造并初始化n个val
vector(const vector& x)拷贝构造函数
vector(InputIterator first,InputIterator last)使用迭代器进行初始化构造

        笔者想要特别提一下这种构造方式:

vector(size_type n, const value_type& val=value_type())

         这里如果没有显式提供要初始化实例,则会调用该类型的默认构造函数进行初始化,如果是整型则会默认初始化为0,如果是自定义类型:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class A
{
public:int a;int b;int c;A():a(1),b(2),c(3){}
};
int main()
{A k;k.a = 4;k.b = 3;vector<A> v1(1,k);cout << v1[0].a << " " << v1[0].b << " " << v1[0].c << endl;vector<A> v2(1);cout << v2[0].a << " " << v2[0].b << " " << v2[0].c << endl;return 0;
}

 输出结果为:

        可以看到,如果是自定义类型给出第二个参数会进行拷贝构造,不给则会进行默认构造。 

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1;//无参构造vector<int> v2(10, 1);//构造并初始化为1vector<int> v3(10);//构造,不给参数会根据元素的类型进行默认初始化vector<int> v4(v2);//拷贝构造string s1("hello world");vector<int> v5(s1.begin(), s1.end());//这样可行吗?里面存储的是什么?
}

三、vector的迭代器

iterator的使用接口说明
begin+endbegin获取第一个数据的位置,end获取最后一个数据的下一个位置
rbegin+rendrbegin获取最后一个数据的位置,rend获取第一个数据的前一个位置

函数原型:

iterator begin() noexcept;
const_iterator begin() const noexcept;iterator end() noexcept;
const_iterator end() const noexcept;reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;

 迭代器的使用:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{int k = 0;vector<int> v1(10);for (auto& i : v1){i += k;++k;}vector<int>::iterator it = v1.begin();//auto it = v1.begin()也可以写成这样while (it != v1.end()){cout << *it << " ";++it;}cout << endl;vector<int>::reverse_iterator it2 = v1.rbegin();while (it2 != v1.rend()){cout << *it2 << " ";++it2;}
}

 输出结果为:

四、vecotr的容量

容量空间接口说明
size获取已存在的数据的个数
capacity获取最多能容纳的数据的个数
empty判断容器是否为空
resize改变vector的size
reserve改变capacity或者预留空间

函数原型:

size_type size() const noexcept;size_type capacity() const noexcept;bool empty() const noexcept;void resize (size_type n);
void resize (size_type n, const value_type& val);void reserve (size_type n);

 容量相关的函数使用:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1(10,1);cout << "初始:" <<endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;v1.reserve(20);cout << "扩容:" << endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;v1.reserve(5);cout << "reverse减少空间:" << endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;v1.resize(5);cout << "resize减少空间:" << endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;
}

 输出结果:

     可以发现,reverse函数只能扩容,不能进行容量缩减,resize函数可以减少size但是不能改变分配的内存空间的大小。   

五、vector的增删查改   

crud函数接口说明
push_back在尾部插入一个数据

       pop_back

删除尾部的一个数据
find查找一个函数第一次出现的下标,但是不是vector的成员
insert在给定的pos前插入一个元素
erase删除给定的pos位置的元素
swap交换两个vector的数据空间
operator[]能够像数组一样访问vector

函数原型:

void push_back (const value_type& val);void pop_back();template <class InputIterator, class T>InputIterator find(InputIterator first, InputIterator last, const T& value);iterator insert (const_iterator position, const value_type& val);
iterator insert (const_iterator position, size_type n, const value_type& val); 
template <class InputIterator>iterator insert (const_iterator position, InputIterator first, InputIterator last);iterator erase (const_iterator position);//擦除对应位置的一个
iterator erase (const_iterator first, const_iterator last);//擦除迭代器对应的一段void swap (vector& x);reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

函数的使用:

push_back函数与pop函数:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v(10);v.push_back(10);cout << "插入后:";for (auto i : v){cout << i << " ";}v.pop_back();v.pop_back();cout << endl;cout << "删除后:";for (auto i : v){cout << i << " ";}return 0;
}

输出结果:

find函数:

        find函数实际上是算法标准库中的一个函数,不是任何一个容器的成员函数。它返回一个迭代器,如果找到则返回对应元素的一个迭代器,否则返回传入的第二个参数,可以配合insert函数和erase函数使用。

template <class InputIterator, class T>InputIterator find(InputIterator first, InputIterator last, const T& value);
#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v = { 1,2,3,4,5,6,3,8,9 };auto it = find(v.begin(), v.end(), 3);if (it != v.end())cout << "发现" << *it << "在位置:" << it - v.begin();elsecout << "没有发现";return 0;
}

 输出结果为:

insert函数:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{int k = 0;vector<int> v(10);for (auto& i : v){i = k;++k;}vector<int> v1(10,1);vector<int> v2(10, 1);vector<int> v3(10, 1);v1.insert(v1.begin() + 2, 10);//只增加一个数据v2.insert(v2.begin()+2, 2,10);//增加自定义个数据v3.insert(v3.begin() + 2, v.begin() + 1, v.begin() + 7);//使用迭代器进行插入cout << "v1:";for (auto i : v1){cout << i << " ";}cout << endl;cout << "v2:";for (auto i : v2){cout << i << " ";}cout << endl;cout << "v3:";for (auto i : v3){cout << i << " ";}return 0;
}

输出结果为:

erase函数: 

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9 };vector<int> v2 = { 1,2,3,4,5,6,7,8,9 };v1.erase(v1.begin() + 2);cout << "v1删除后:";for (auto i : v1){cout << i << " ";}cout << endl;v2.erase(v2.begin() + 2, v2.begin() + 5);cout << "v2删除后:";for (auto i : v2){cout << i << " ";}return 0;
}

输出结果为:

swap函数: 

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1 = { 1,2,3,4,5 };vector<int> v2 = { 5,6,7,8,9 };v1.swap(v2);cout << "v1:";for (auto i : v1){cout << i << " ";}cout << endl;cout << "v2:";for (auto i : v2){cout << i << " ";}return 0;
}

输出结果:

operator[]: 

        可以通过[]像数组那样访问vector:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9};for (int i = 0; i < v1.size(); ++i)cout << v1[i] << " ";return 0;
}

输出结果为:

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

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

相关文章

迁徙线,动态轨迹线

使用canvas结合贝塞尔曲线实现&#xff0c;效果如下 <template><div class"box"><div class"mapBox"><div class"map"><img src"/img/dataCockpit/map.png" alt"" /><div class"dot&…

SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-39/ 本关是堆…

NVM 介绍及使用指南

在日常的开发工作中&#xff0c;我们往往会遇到需要在同一台机器上同时管理多个版本的 Node.js 的情况。为了解决这个问题&#xff0c;我一个同事推荐了NVM&#xff08;Node Version Manager&#xff09;。NVM 是一个用于管理 Node.js 版本的工具&#xff0c;可以方便地在不同的…

web——[SUCTF 2019]EasySQL1——堆叠注入

这个题主要是讲述了堆叠注入的用法&#xff0c;来复现一下 什么是堆叠注入 堆叠注入&#xff1a;将多条SQL语句放在一起&#xff0c;并用分号;隔开。 1.查看数据库的名称 查看数据库名称 1;show databases; 发现有名称为ctftraining的数据库 2.对表进行查询 1;show tabl…

【ARM】MDK-烧录配置文件无权限访问

【更多软件使用问题请点击亿道电子官方网站】 1、 问题场景 客户代码编译正常、调试出现报错<Error: Flash Download failed - "Cortex-M4"> 仿真器识别正常&#xff0c;keil-Debug内显示相关信息、设备启动正常。 记录排查步骤&#xff0c;找到配置文件位…

深度解析 ICP 备案、公安备案、等保备案编号与统一社会信用代码

1. 前言 在当今数字化时代&#xff0c;各类网站和系统如雨后春笋般涌现&#xff0c;为了确保网络安全、合法运营以及用户信息保护&#xff0c;不同类型的备案工作应运而生。其中&#xff0c;ICP 备案、公安备案和等保备案尤为重要&#xff0c;它们各自对应的备案编号不仅是一串…

11个简单易用的电商购物车设计案例

文章目录 前言正文1.扁平化设计购物车2.无表格布局购物车3.美食购物车4.响应式购物车5.jQuery购物车6.动态价格更新购物车7.标签式滑动购物车8.动态商店与购物车一体化设计9.简约清爽的购物车设计10.基于Vue.js的购物车11.域名购物车 总结 前言 现在的电子商务网站&#xff0c…

turtlesim修改窗口大小;添加自己的小乌龟;

目前手边有humble版本ROS。以此为教程。其他版本以此类推 github中搜索ros&#xff0c;然后选择ros官网&#xff08;九点方阵那个图标&#xff09;。然后 在branch中&#xff0c;选择humble&#xff0c;然后复制链接。 git clone https://github.com/ros/ros_tutorials.git -…

电阻按材料分类、不同的电阻

TOC 按电阻材料工艺进行分类 3.1.线绕电阻&#xff1a; 使用高电阻率的康铜、锰铜或镍铬合金丝缠绕在陶瓷骨架&#xff08;一般采用陶瓷、塑料、涂覆绝缘层的金属骨架&#xff09;上制作而成的。玻璃釉绕线电阻表面被覆一层玻璃釉&#xff1b;涂漆线绕电阻表面被覆一层保护有…

spark的学习-06

SparkSQL读写数据的方式 1&#xff09;输入Source 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a…

react-markdown内容宽度溢出和换行不生效问题

情景复现&#xff1a; 解决办法&#xff0c;添加样式进行限制 /* index.css */ .markdown-container {word-break: break-word; /* 强制长单词断行 */white-space: pre-wrap; /* 保留空白符序列&#xff0c;但是正常地进行换行 */overflow-wrap: break-word; /* 在长单词或…

java双向链表解析实现双向链表的创建含代码

双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建&#xff08;头插法&#xff09;二.AddLast创建&#xff08;尾叉法&#xff09;三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…

VMWare虚拟机NAT模式下与外部主机(非宿主机)通信

VMWare虚拟机NAT模式下与外部主机(非宿主机)通信 1. VMWare虚拟机网络 VMWare的三种网络工作模式&#xff1a; Bridged&#xff1a;桥接模式NAT&#xff1a;网络地址转换模式Host-Only &#xff1a;仅主机模式 VMWare 网络连接配置界面如下&#xff1a; 在本次测试环境中&a…

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中&#xff0c;如何延长电池的使用寿命是大家非常关心的问题&#xff0c;而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池&#xff0c;因此长时间的充电与长时间放点都不可取&#xff0c;但是在日常的使用过程中…

显示器接口种类 | 附图片

显示器接口类型主要包括VGA、DVI、HDMI、DP和USB Type-C等。 VGA、DVI、HDMI、DP和USB Type-C 1. 观察 VGA接口:15针 DP接口&#xff1a;在DP接口旁&#xff0c;都有一个“D”型的标志。 电脑主机&#xff1a;DP(D) 显示器&#xff1a;VGA(15针) Ref https://cloud.tenc…

qt QUndoCommand 与 QUndoStack详解

1、概述 QUndoCommand 和 QUndoStack 是 Qt 框架中用于实现撤销/重做&#xff08;undo/redo&#xff09;功能的两个核心类。QUndoCommand 是表示单个可撤销操作的基类&#xff0c;而 QUndoStack 则负责管理这些命令的堆栈&#xff0c;提供撤销和重做操作的接口。 QUndoCommand…

双指针(二)双指针到底是怎么个事

一.有效的三角形个数 有效的三角形个数 class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int i0,end nums.length-1;int count 0;for( i end;i>2;i--){int left 0;int right i-1;while(left<right){if(nums[left]nums[right]>nums…

springboot的增删改查商城小实践(b to c)

首先准备一张表&#xff0c;根据业务去设计表 订单编号是参与业务的&#xff0c;他那订单编号里面是有特殊意义的&#xff0c;比如说像什么一些年月日什么的&#xff0c;一些用户的ID都在那编号里面呢&#xff1f;不能拿这种东西当主件啊 根据数据量去决定数据类型 价格需要注意…

动态规划-背包问题——416.分割等和子集

1.题目解析 题目来源 416.分割等和子集——力扣 测试用例 2.算法原理 1.状态表示 这里背包问题基本上和母题的思路大相径庭&#xff0c;母题请见 [模板]01.背包 &#xff0c;这里的状态表示与装满背包的情况类似&#xff0c;第二个下标就是当选择的物品体积直接等于j时是否可…

开源 - Ideal库 -获取特殊时间扩展方法(四)

书接上回&#xff0c;我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天&#xff08;周一&#xff09;核心思想是一样的&#xff0c;只是把求周一改成求周几而已&#xff0c;当然其…