【C++之容器篇】精华:vector常见函数的接口的熟悉与使用
目录
- 前言
- 一、认识vector
- 1. 介绍
- 2. 成员类型
- 二、默认成员函数(Member functions)
- 1. 构造函数
- 2. 拷贝构造函数
- vector (const vector& x);
- 3. 析构函数
- 4. 赋值运算符重载函数
- 三、迭代器(Iterators)
- 1. 普通对象的迭代器
- 2. const对象的迭代器
- 3. 普通对象的反向迭代器
- 4. const对象的反向迭代器
- 四、容量接口(Capacity)
- 1. size()
- 2. capacity()
- 3. reserve()
- 4. resize()
- 五、元素访问接口(Element access)
- 1. operator[]
- (1)reference operator[](size_t n)
- (2)const reference operator[](size_t n)const
- 2. at()
- (1)reference at() const
- (2)const reference at(size_t n) const
- 3. front()
- 4.back()
- 六、修改接口(Modifiers)
- 1. push_back()
- 2. pop_back()
前言
前面我们在学习C语言版本的数据结构时,学习过SeqList顺序表的实现,C语言实现的顺序表存在一定的局限性,一次性只能支持存储一种类型的数据,今天我们将学习C++标准库中一种新的顺序表:vector的使用
一、认识vector
1. 介绍
vector是一个支持动态扩容的数组,并且是以模板进行支持的,所以可以实现存储不同类型的数据,实用性比较广。

2. 成员类型

二、默认成员函数(Member functions)
1. 构造函数

标准库中的vector支持了很多版本的构造函数,但是在实际的使用过程中比较常用的是无参的构造函数。
- 代码1:无参构造函数
int main()
{vector<int> v1;vector<double> v2;vector<string> v3;return 0;
}
调试结果:

- 代码2:使用n个数据进行构造
int main()
{vector<int> v1(6, 8);vector<double> v2(5, 6.6);vector<string> v3(6, "hello std::vector");return 0;
}
调试结果:

- 代码3:使用一个迭代器区间进行构造
int main()
{string s("hello std::vector::vector(iterator begin,iterator end)");vector<char> v(s.begin(), s.end());for (auto e : v){cout << e << " ";}cout << endl;return 0;
}
运行结果:

2. 拷贝构造函数
vector (const vector& x);
vector的拷贝构造函数需要实现成深拷贝,其用法和其他类基本类似
- 代码:
int main()
{string s("hello std::vector::vector(iterator begin,iterator end)");vector<char> v(s.begin(), s.end());vector<char> v1(v);for (auto e : v){cout << e << " ";}cout << endl;for (auto e : v1){cout << e << " ";}cout << endl;return 0;
}
运行结果:

3. 析构函数
vector中有动态申请的资源,所以需要手动实现析构函数在函数生命周期结束时自动调用该析构函数完成资源的释放。
4. 赋值运算符重载函数

赋值运算符重载函数需要实现的也是深拷贝,下面介绍其用法:
- 代码:
int main()
{string s("hello std::vector(const vector<char>&v)");vector<char> v1(s.begin(),s.end());vector<char> v2;v2 = v1;cout << "v1:" << endl;for (auto ch : v1){cout << ch << " ";}cout << endl;cout << "v2:" << endl;for (auto ch : v2){cout << ch << " ";}cout << endl;return 0;
}
运行结果:

三、迭代器(Iterators)
1. 普通对象的迭代器
普通对象一般调用的就是普通的迭代器,迭代器的一个很重要的作用就是遍历数组,同时范围for的底层原理就是迭代器
- 代码1:遍历
int main()
{string s("hello std::vector::iterator begin() and end()");vector<char> v(s.begin(), s.end());vector<char>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << " ";vit++;}cout << endl;for (auto& ch : v){cout << ch << " ";}cout << endl;return 0;
}
运行结果:

- 代码2:支持修改
int main()
{string s("hello std::vector::iterator begin() and end()");vector<char> v(s.begin(), s.end());vector<char>::iterator vit = v.begin();while (vit != v.end()){(*vit) += 1;cout << *vit << " ";vit++;}cout << endl;for (auto& ch : v){cout << ch << " ";}cout << endl;return 0;
}
运行结果:

2. const对象的迭代器
const类型的对象调用const版本的迭代器,不支持修改,支持遍历容器
- 代码:
int main()
{string s("hello std::vector::const_iterator begin() and end()");const vector<char> v(s.begin(), s.end());vector<char>::const_iterator vit = v.begin();while (vit != v.end()){cout << *vit << " ";vit++;}cout << endl;return 0;
}
运行结果:

- 代码2:不支持修改

3. 普通对象的反向迭代器
- 代码:
int main()
{string s("hello std::vector<char>::iterator rbegin() and rend()");vector<char> v(s.begin(), s.end());vector<char>::reverse_iterator vit = v.rbegin();while (vit != v.rend()){cout << *vit << " ";vit++;}cout << endl;return 0;
}
运行结果:

4. const对象的反向迭代器
- 代码:
int main()
{string s("hello std::vector<char>::const_reverse_iiterator rbegin() and rend()");const vector<char> v(s.begin(), s.end());vector<char>::const_reverse_iterator vit = v.rbegin();while (vit != v.rend()){cout << *vit << " ";vit++;}cout << endl;return 0;
}
运行结果:

四、容量接口(Capacity)
1. size()

- 代码:
int main()
{string s("hello std::vector<char>::size()");vector<char> v(s.begin(),s.end());cout << "size:" << v.size() << endl;return 0;
}
运行结果:

2. capacity()

- 代码:
int main()
{string s("hello std::vector<char>::capacity()");vector<char> v(s.begin(), s.end());cout << "capacity:" << v.capacity() << endl;return 0;
}
运行结果:

3. reserve()

- 代码:
int main()
{string s("hello std::vector<char>::reserve()");vector<char> v(s.begin(), s.end());cout << "capacity:" << v.capacity() << endl;v.reserve(100);cout << "capacity:" << v.capacity() << endl;return 0;
}
运行结果:

4. resize()

- 代码1:
int main()
{string s("hello std::vector<char>::resize()");vector<char> v(s.begin(),s.end());cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;v.resize(100, 'x');cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;return 0;
}
运行结果:

- 代码2:
int main()
{string s("hello std::vector<char>::resize()");vector<char> v(s.begin(), s.end());v.reserve(50);cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;v.resize(46, 'x');cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;return 0;
}
运行结果:

- 代码3:
int main()
{string s("hello std::vector<char>::resize()");vector<char> v(s.begin(), s.end());v.reserve(50);cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;v.resize(23, 'x');cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;return 0;
}
运行结果:

五、元素访问接口(Element access)
1. operator[]

(1)reference operator[](size_t n)
- 代码:
int main()
{string s("hello std::vector<char>::reference operator[](size_t n)");vector<char> v(s.begin(), s.end());for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;return 0;
}
运行结果:

(2)const reference operator[](size_t n)const
- 代码:
int main()
{string s("hello std::vector<char>::const reference operator[](size_t n)");const vector<char> v(s.begin(), s.end());for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;return 0;
}
运行结果:

2. at()

(1)reference at() const
- 代码:
int main()
{string s("hello std::vector<char>::reference at(size_t n)");vector<char> v(s.begin(), s.end());for (size_t i = 0; i < v.size(); i++){cout << v.at(i) << " ";}cout << endl;return 0;
}
运行结果:

(2)const reference at(size_t n) const
- 代码:
int main()
{string s("hello std::vector<char>::const reference at(size_t n) const");const vector<char> v(s.begin(), s.end());for (size_t i = 0; i < v.size(); i++){cout << v.at(i) << " ";}cout << endl;return 0;
}
运行结果:

3. front()

- 代码:
int main()
{string s("hello std::vector<char>::front()");vector<char> v(s.begin(), s.end());cout << v.front() << endl;return 0;
}
运行结果:

4.back()

- 代码:
int main()
{string s("hello std::vector<char>::back()");vector<char> v(s.begin(), s.end());cout << v.back() << endl;return 0;
}
运行结果:

六、修改接口(Modifiers)
1. push_back()

- 代码:
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);vector<int>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << " ";vit++;}cout << endl;return 0;
}
运行结果:

2. pop_back()

- 代码:
int main()
{string s("hello std::vector<char> pop_back()");vector<char> v(s.begin(), s.end());vector<char>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << " ";vit++;}cout << endl;v.pop_back();v.pop_back();for (auto& ch : v){cout << ch << " ";}cout << endl;return 0;
}
运行结果:

相关文章:
【C++之容器篇】精华:vector常见函数的接口的熟悉与使用
目录前言一、认识vector1. 介绍2. 成员类型二、默认成员函数(Member functions)1. 构造函数2. 拷贝构造函数vector (const vector& x);3. 析构函数4. 赋值运算符重载函数三、迭代器(Iterators)1. 普通对象的迭代器2. const对象…...
InstructGPT
文章目录Abstract 给定人类的命令,并且用人工标注想要的结果,构成数据集,使用监督学习来微调GPT-3。 然后,我们对模型输出进行排名,构成新的数据集,我们利用强化学习来进一步微调这个监督模型。 我们把产…...
RTOS之一环境搭建(基于TM4C123GXL)
硬件TM4C123GXLBOOSTXL-EDUMKII keil5micriumOSA软件安装:1 ARM-MDK(MDK538aMDK_Stellaris_ICDI_AddOn)MDK538a链接:https://www.keil.com/demo/eval/arm.htmICDI链接:https://documentation-service.arm.com/static/60509bd61da8f8344a2ca1b…...
151、【动态规划】AcWing ——2. 01背包问题:二维数组+一维数组(C++版本)
题目描述 原题链接:2. 01背包问题 解题思路 (1)二维dp数组 动态规划五步曲: (1)dp[i][j]的含义: 容量为j时,从物品1-物品i中取物品,可达到的最大价值 (2…...
DS期末复习卷(二)
选择题 1.下面关于线性表的叙述错误的是( D )。 (A) 线性表采用顺序存储必须占用一片连续的存储空间 (B) 线性表采用链式存储不必占用一片连续的存储空间 © 线性表采用链式存储便于插入和删除操作的实现 (D) 线性表采用顺序存储便于插…...
大数据技术架构(组件)31——Spark:Optimize--->JVM On Compute
2.1.9.4、Optimize--->JVM On Compute首要的一个问题就是GC,那么先来了解下其原理:1、内存管理其实就是对象的管理,包括对象的分配和释放,如果显式的释放对象,只要把该对象赋值为null,即该对象变为不可达.GC将负责回…...
ETL基础概念及要求详解
ETL基础概念及要求详解概念ETL与ELT数据湖与数据仓库ETL应用场景ETL具体流程及操作要求抽取清洗转换加载ETL设计模式SQL脚本语言ETL工具设计ETL工具SQLETL接口设计要求明确接口属性约定接口形式确定接口抽取方法规范接口格式概念 ETL即Extract(抽取)Tra…...
刷题记录:牛客NC23054华华开始学信息学 线段树+分块
传送门:牛客 题目描述: 题目latex公式较多,此处省略 输入: 10 6 1 1 1 2 4 6 1 3 2 2 5 7 1 6 10 2 1 10 输出: 3 5 26这道题让我体验到的线段树相对于树状数组的常数巨大 我们倘若直接用单点修改的话,如果D过小比如1那么我们足足要加n次,时间复杂度爆…...
二叉搜索树(查找,插入,删除)
目录 1.概念 2.性质 3.二叉搜索树的操作 1.查找 2.插入 3.删除(难点) 1.概念 二叉搜索树又称二叉排序树.利用中序遍历它就是一个有顺序的一组数. 2.性质 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空,则右子树上所有节点的值都…...
C# PictureEdit 加载图片
方法一: 如果要加载的图片的长宽比不是太过失衡, 1.可以改变picturebox的SizeMode属性为 PictureBoxSizeMode.StretchImage, 2.或者Dev控件 PictureEdit的SizeMode属性为Zoom。(zoom:缩放;clip剪短;stret…...
3种方法设置PDF“打开密码”,总有一种适合你
PDF文件是我们工作中经常用到的文件之一,对于重要的文件,设置“打开密码”是一种很好的保护方式。下面就来说说,设置PDF“打开密码”有哪三种方法? 方法一:在线网站加密 市面上有很多可以直接在线上加密PDF文件的产品…...
第三章 数据链路层(点到点的传输服务)-计算机网络(笔记)
计算机网络 第三章 数据链路层(点到点的传输服务) 数据链路层属于计算机网络的低层。数据链路层使用的信道主要有以下两种类型: (1)点到点信道。这种信道使用一对一的点到点通信方式。 (2)广…...
volatile关键字与CAS机制
volatile关键字 volatile关键字可以对类的成员变量与静态变量进行修饰 volatile关键字的作用 1.保证被修饰属性的可见性,被修饰后的属性如果被更改后其他线程是会立即可见的 2.保证被修饰属性的有序性,被修饰后的属性禁止修改指令执行的顺序 注意:volatile关键字不能保证属性…...
LeetCode题解 动态规划(四):416 分割等和子集;1049 最后一块石头的重量 II
背包问题 下图将背包问题做了分类 其中之重点,是01背包,即一堆物件选哪样不选哪样放入背包里。难度在于,以前的状态转移,多只用考虑一个变量,比如爬楼梯的阶层,路径点的选择,这也是能用滚动数组…...
【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(二)
demux模块 从前面一篇文章中可以得知,demux模块的使用方法大致如下: 分配AVFormatContext通过avformat_open_input(…)传入AVFormatContext指针和文件路径,启动demux通过av_read_frame(…) 从AVFormatContext中读取demux后的audio/video/subtitle数据包…...
PCIE 学习笔记(入门简介)
PCIE 学习笔记书到用时方恨少啊,一年前学PCIE的笔记,再拿出来瞅瞅。发到博客上,方便看。PCIE基础PCIE和PCI的不同PCIE采用差分信号传输,并且是dual-simplex传输——每条lane上有TX通道和RX通道,所以每条lane上的信号是…...
锁的优化机制了解嘛?请进!
点个关注,必回关 文章目录自旋锁:自适应锁:锁消除:锁粗化:偏向锁:轻量级锁:从JDK1.6版本之后,synchronized本身也在不断优化锁的机制,有些情况下他并不会是一个很重量级的…...
5.点赞功能 Redis
Redis(1)简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中,性能高。(2&#…...
Java序列化和反序列化(详解)
一、理解Java序列化和反序列化 Serialization(序列化):将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。 deserialization(反序列化):将保存在磁…...
【刷题篇】链表(上)
前言🌈前段时间我们学习了单向链表和双向链表,本期将带来3道与链表相关的OJ题来巩固对链表的理解。话不多说,让我们进入今天的题目吧!🚀本期的题目有:反转单链表、链表的中间结点、合并两个有序链表反转单链…...
轻量级工具G-Helper:一站式解决ROG游戏本色彩配置异常问题
轻量级工具G-Helper:一站式解决ROG游戏本色彩配置异常问题 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目…...
如何突破内容访问限制?5类开源工具的技术解析与场景适配
如何突破内容访问限制?5类开源工具的技术解析与场景适配 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代,优质内容往往被各种访问限制所阻…...
RS485接口EMC设计与防护电路实现
RS485接口电路的EMC设计与工程实现1. 项目概述1.1 RS485接口的EMC挑战RS485作为工业通信标准接口,其典型应用场景中信号走线常与电源线、功率信号线混合布线,导致以下EMC问题:共模干扰通过长距离传输线耦合浪涌脉冲对接口电路的冲击损坏高频噪…...
GraphRAG:当 RAG 遇上知识图谱,信息检索从此不一样了
假设你把公司过去三年的所有周报、会议纪要、项目文档丢进一个 RAG 系统,然后问它:“过去一年里,研发团队和产品团队之间的主要分歧有哪些?”——大概率你会得到几段看起来相关的文字片段,但拼不出一个完整的答案。 这…...
2026年多模态AI前瞻:Qwen3-VL-2B开源生态发展潜力分析
2026年多模态AI前瞻:Qwen3-VL-2B开源生态发展潜力分析 1. 项目概述与核心价值 Qwen3-VL-2B-Instruct作为新一代开源视觉语言模型,代表了多模态AI技术的重要发展方向。这个模型不仅能够理解文本,更重要的是具备了"看"的能力——它…...
三步突破抖音音乐批量下载难题:douyin-downloader全功能技术指南
三步突破抖音音乐批量下载难题:douyin-downloader全功能技术指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作领域,背景音乐是提升作品感染力的关键元素。然而&…...
十 438. 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词https://leetcode.cn/problems/find-all-anagrams-in-a-string/ 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd"…...
RWKV7-1.5B-g1a惊艳案例:将复杂段落压缩为三条逻辑闭环要点
RWKV7-1.5B-g1a惊艳案例:将复杂段落压缩为三条逻辑闭环要点 1. 模型能力展示:从复杂到简洁的文本处理 RWKV7-1.5B-g1a作为一款轻量级文本生成模型,在信息压缩和提炼方面展现出令人惊喜的能力。我们通过一个实际案例来展示它如何将复杂内容转…...
语音合成延迟优化:IndexTTS-2-LLM网络IO调优实战
语音合成延迟优化:IndexTTS-2-LLM网络IO调优实战 1. 为什么语音合成总在“等”?从用户卡顿说起 你有没有试过在语音合成页面点下“开始合成”,然后盯着进度条数秒——明明只是一句话,却要等3秒、5秒,甚至更久&#x…...
5分钟搞定黑苹果音频驱动:AppleALC新手配置指南
5分钟搞定黑苹果音频驱动:AppleALC新手配置指南 【免费下载链接】AppleALC Native macOS HD audio for not officially supported codecs 项目地址: https://gitcode.com/gh_mirrors/ap/AppleALC AppleALC是一款强大的开源内核扩展工具,能让非官方…...
