【C++之容器篇】精华:vector常见函数的接口的熟悉与使用

news2024/12/23 12:06:14

目录

    • 前言
    • 一、认识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;
}

运行结果:
在这里插入图片描述

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

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

相关文章

4.5.3 ArrayList

文章目录1.特点2. 练习:ArrayList测试3.ArrayList扩容1.特点 存在java.util包中内部是用数组结构存放数据,封装数组的操作,每个对象都有下标内部数组默认的初始容量是10,如果不够会以1.5倍的容量增长查询快,增删数据效率会低 2. 练习:ArrayList测试 package partThree;import…

ROS2机器人编程简述humble-第四章-COMPUTATION GRAPH .2

下图所示&#xff0c;机器人和障碍物直接距离&#xff1a;可以看到如果是单线雷达&#xff0c;这种测距和传感器安装的位置密切相关。chatgpt&#xff1a;ROS2机器人的COMPUTATION GRAPH概念是指&#xff0c;通过构建一个图形结构&#xff0c;将机器人的计算任务分解成一系列的…

蓝桥杯-最长公共子序列(线性dp)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知有两个数组a,b。已知每个数组的长度。要求求出两个数组的最长公共子序列 序列 1 2 3 4 5 序列 2 3 2 1 4 5 子序列&#xff1a;从其中抽掉某个或多个元素而产生的新…

libVLC 视频裁剪

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 裁剪是指去除图像的外部部分,也就是从图像的左,右,顶部和/或底部移除一些东西。通常在视频中,裁剪是一种通过剪切不需要的部分来改变宽高比的特殊方式。 尤其是在做视频墙时,往往需要处理多个 vlc 实例…

【排序算法】归并排序(Merge Sort)

将两个的有序数列合并成一个有序数列&#xff0c;我们称之为"归并"。归并排序(Merge Sort)就是利用归并思想对数列进行排序。归并排序介绍根据具体的实现&#xff0c;归并排序包括"从上往下"和"从下往上"2种方式。从下往上的归并排序将待排序的数…

Java常见的六种线程池、线程池-四种拒绝策略总结

点个关注&#xff0c;必回关 一、线程池的四种拒绝策略&#xff1a; CallerRunsPolicy - 当触发拒绝策略&#xff0c;只要线程池没有关闭的话&#xff0c;则使用调用线程直接运行任务。 一般并发比较小&#xff0c;性能要求不高&#xff0c;不允许失败。 但是&#xff0c;由于…

SpringCloud(20):Sentinel原理

1.Sentinel主要功能设计理念 1.1 流量控制 流量控制在网络传输中是一个常用的概念&#xff0c;它用于调整网络包的发送数据。然而&#xff0c;从系统稳定性角度考虑&#xff0c;在处理请求的速度上&#xff0c;也有非常多的讲究。任意时间到来的请求往往是随机不可控的&#…

排序:归并排序

一、归并 li[2,4,5,7,//1,3,6,8]#归并的前提是必须两部分排好序 def merge(li,low,mid,high):ilowjmid1ltmp[]while i<mid and j<high: #只要左右两边都有数if li[i]<li[j]:ltmp.append(li[i])i1else:ltmp.append(li[j])j1#while执行完&#xff0c;肯定有一部分没数…

MDB 5 UI-KIT Bootstrap 5 最新版放送

顶级开源 UI 套件&#xff0c;Bootstrap v5 和 v4 的材料设计&#xff0c;jQuery 版本&#xff0c;数百个优质组件和模板&#xff0c;所有一致的&#xff0c;有据可查的&#xff0c;可靠的超级简单&#xff0c;1分钟安装简单的主题和定制 受到超过 3,000,000 名开发人员和设计师…

工业互联网时代,VR工厂如何实现多媒体营销?

2023开年以来&#xff0c;国内消费复苏脚步逐渐加快&#xff0c;无论是餐饮、旅游还是电影市场人气逐渐旺盛&#xff0c;可以看到消费市场逐渐暖起来。而工业互联网将会是产业数字化的主要抓手&#xff0c;VR工厂是新时期、新形势下&#xff0c;运用“互联网”思维&#xff0c;…

ChatGPT简要解读(三) - ChatGPT发展历程及模型训练机制

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录&#x1f423; 一、发展历程&#x1f534; 1、基本概念&#x1f7e0…

Android图形显示流程简介

注&#xff1a;本文缩写说明本文代码都是基于Android S一、概述本文将对从App画出一帧画面到这帧画面是如何到达屏幕并最终被人眼看到的这一过程进行简要分析&#xff0c;并将这其中涉及到的各个流程与其在systrace上的体现对应起来&#xff0c;期望最终能够让读者对Android系统…

Geek Uninstaller:向流氓软件火力全开,超良心的软件彻底卸载工具

写在前面 我们在电脑上安装软件&#xff0c;以及在使用软件的过程中&#xff0c;会产生一些程序文件、注册表项和临时文件等&#xff0c;用来支持软件的正常使用&#xff0c;都是正常现象。 但是&#xff0c;在卸载软件时&#xff0c;很多软件自身的卸载程序很不负责任&#…

内网渗透(十六)之内网信息收集-powershell基础知识

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

chatGPT接入个人微信教程(国内可用)

chatGPT最近突然又大火起来了&#xff0c;而且这次不是一般的火&#xff0c;带有浓浓的商业气息火了。各个互联网大厂都开始进军了&#xff0c;感觉要来一场ChatGPT的军备竞赛一样&#xff0c;看看谁先获取国内的地盘。 作为吃瓜群众&#xff0c;我们也能个人使用ChatGPT&…

PCB设计中的正片和负片设计原理

PCB实际的最终目的 让需要导通的地方铺有铜&#xff0c;让不需要导通的地方没有铜 正片和负片的含义 参考&#xff1a;https://www.sohu.com/a/203224754_100012544&#xff0c;https://blog.csdn.net/weixin_42837669/article/details/110411765 查找资料中常见说法&#x…

力扣HOT100 (1-5)

目录 1.两数之和 2.两数相加 拓展到牛客的TOP101的BM11( 链表相加&#xff08;二&#xff09;) 3.无重复的最长子串&#xff08;牛客BM92&#xff09; 解法1&#xff1a; 解法2&#xff1a; 4.寻找两个正序数组的中位数 5.最长回文子串 1.两数之和 思路&#xff1a;用Has…

Centos7下安装单节点flink1.13

前置环境配置jdk可以参考博文&#xff1a;Centos7下安装hadoop单节点 。 如下图所示&#xff0c;这里我们将flink-1.13.0-bin-scala_2.12.tgz上传到如下路径&#xff1a; 解压安装文件到/opt/module下面 tar -zxvf flink-1.13.0-bin-scala_2.12.tgz -C /opt/module/将flink…

背包问题求方案数、具体方案

背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…

如何实现LFU缓存(最近最少频率使用)

目录 1.什么是LFU缓存&#xff1f; 2.LFU的使用场景有哪些&#xff1f; 3.LFU缓存的实现方式有哪些&#xff1f; 4.put/get 函数实现具体功能 1.什么是LFU缓存&#xff1f; LFU缓存是一个具有指定大小的缓存&#xff0c;随着添加元素的增加&#xff0c;达到容量的上限&…