【C++】vector常见的使用方式

前言:在上一篇中我们讲到了string类的模拟实现,今天我们将进一步的去学习vector的一些常用的使用方法。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • 什么是vector
  • vector的使用
    • vector构造函数的使用
    • vector常见函数的使用
      • 迭代器的使用
      • rebegin()和rend()函数
      • push_back():在向量的末尾添加一个元素
      • pop_back():删除向量的最后一个元素
      • size():返回向量中元素的个数
      • empty():检查向量是否为空,如果为空则返回 true,否则返回 false
      • capacity()
      • clear():清空向量中的所有元素
      • front():返回向量的第一个元素
      • back():返回向量的最后一个元素
      • insert():在指定位置插入一个或多个元素
      • erase():删除指定位置或指定范围的元素
      • resize():调整向量的大小
      • swap():交换两个向量的内容
      • vector中operator[]
    • vector中嵌套vector的二维矩阵或多维数组

什么是vector

在C++中,vector是一种动态数组容器,可以存储一系列具有相同数据类型的元素。它提供了一些操作函数,如插入、删除、访问等,使得对数组进行操作更加方便和灵活。

与普通的数组相比,vector具有以下优点:

  1. 可以在运行时动态调整大小,不需要事先指定大小;
  2. 可以自动处理内存分配和释放,减少手动管理内存的工作量;
  3. 提供了更多的操作函数,如插入、删除、查找等;
  4. 可以通过下标访问元素。

vector的使用

vector构造函数的使用

  1. 默认构造函数
vector<int> vec; // 创建一个空的整数向量
  1. 带有初始值的构造函数:
int main()
{
	//vector<int> vec; // 创建一个空的整数向量
	int n = 0,value = 0;
	cout << "输入元素个数" << endl;
	cin >> n;
	vector<int> vec(n); // 创建一个包含 n 个默认初始化的整数元素的向量
	for (auto e : vec)//遍历容器中的值
	{
		cout << e << " ";
	}
	cout << endl;

	cout << "输入元素的值" << endl;
	cin >> value;
	vector<int> vec1(n, value); // 创建一个包含 n 个值为 value 的整数元素的向量
	for (auto e : vec1)//遍历容器中的值
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

  1. 复制构造函数
int main()
{
	vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量
	vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2
	for (auto s : vec2)
	{
		cout << s << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
4. 列表初始化 (C++11 及以上版本)

int main()
{
	vector<int> vec4{ 1, 2, 3, 4, 5 }; // 使用列表初始化创建向量 vec4
	for (auto s : vec4)
	{
		cout << s << " ";
	}
	return 0;
}

在这里插入图片描述

  1. 区间构造函数
int main()
{
	vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量
	vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2
	for (auto s : vec2)
	{
		cout << s << " ";
	}
	cout << endl;
	vector<int> vec3(vec1.begin(), vec1.end()); // 使用迭代器指定区间来创建向量 vec3
	for (auto s : vec3)
	{
		cout << s << " ";
	}
	return 0;
}

在这里插入图片描述


vector常见函数的使用

迭代器的使用

在C++中,vector类提供了**begin()end()**成员函数来获取指向容器中第一个元素和最后一个元素之后位置的迭代器。

调用begin()函数会返回一个指向容器中第一个元素的迭代器。调用end()函数会返回一个指向容器中最后一个元素之后位置的迭代器。

int main() 
{
    std::vector<int> vec = { 1, 2, 3, 4, 5 };
    // 使用begin()函数获取指向第一个元素的迭代器
    std::vector<int>::iterator it_begin = vec.begin();

    // 使用end()函数获取指向最后一个元素之后位置的迭代器
    std::vector<int>::iterator it_end = vec.end();

    // 使用迭代器遍历vector并输出所有元素
    for (std::vector<int>::iterator it = it_begin; it != it_end; ++it) 
    {
        std::cout << *it << " ";
    }
    return 0;
}

在这里插入图片描述


rebegin()和rend()函数

在使用vector中的rbegin()rend()函数时,请按照以下步骤进行操作:

  1. 在代码中包含<vector>头文件。
  2. 创建一个vector对象并向其中添加元素。
  3. 使用rbegin()函数获取指向向量最后一个元素的迭代器。
  4. 使用rend()函数获取指向向量中第一个元素之前位置的迭代器。
  5. 使用循环以逆序的方式遍历向量,从rbegin()函数返回的迭代器开始,到rend()函数返回的迭代器结束。

下面是一个示例来说明用法:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec = {1, 2, 3, 4, 5};

    // 以逆序的方式遍历向量
    for (auto it = myVec.rbegin(); it != myVec.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果:

5 4 3 2 1

在这个例子中,我们创建了一个名为myVecvector对象,并用一些整数值进行了初始化。然后,我们使用for循环和一个逆序迭代器(rbegin()函数)和一个普通迭代器(rend()函数)来以逆序的方式打印向量的元素。

push_back():在向量的末尾添加一个元素

int main()
{
	vector<int> vec;
	vec.push_back(10); // 向 vec 中添加元素 10
	vec.push_back(20); // 向 vec 中添加元素 20
	vec.push_back(20); // 向 vec 中添加元素 20
	vec.push_back(0); // 向 vec 中添加元素 20
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


pop_back():删除向量的最后一个元素

int main()
{
	vector<int> vec = { 10, 20, 30,40,50 };
	cout << "删除前" << endl;
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << "删除后" << endl;
	vec.pop_back(); // 删除 vec 的最后一个元素
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


size():返回向量中元素的个数

int main()
{
	vector<int> vec = { 10, 20, 30 };
	cout <<"该容器的元素个数是: " << vec.size() << endl;
	return 0;
}

在这里插入图片描述


empty():检查向量是否为空,如果为空则返回 true,否则返回 false

int main()
{
	vector<int> vec = { 1,2 };
	bool isEmpty = vec.empty(); // 返回 true,因为 vec 是空的
	if (isEmpty)
	{
		cout << "该容器是空的" << endl;
	}
	else
	{
		cout << "该容器不是空的" << endl;

	}
	return 0;
}

在这里插入图片描述


capacity()

在使用vectorcapacity()函数时,它返回的是vector当前分配的内存容量大小,即可以容纳的元素数量。以下是使用capacity()函数的几个常见情况:

  1. 获取vector的容量:使用capacity()函数可以获取当前vector的容量。
#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec;

    std::cout << "Vector capacity: " << myVec.capacity() << std::endl;

    return 0;
}

输出结果:

Vector capacity: 0

在这个例子中,我们创建了一个名为myVec的空vector对象,并使用capacity()函数获取其容量。由于vector是空的,所以容量为0。

  1. 预分配容量:有时候可以使用reserve()函数来预分配vector的容量,以减少不必要的重新分配的次数。
#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec;

    myVec.reserve(10);  // 预分配10个元素的容量

    std::cout << "Vector capacity: " << myVec.capacity() << std::endl;

    return 0;
}

输出结果:

Vector capacity: 10

在这个例子中,我们使用reserve()函数预分配了10个元素的容量,然后使用capacity()函数获取当前容量。

  1. 动态调整容量:vector会根据需要自动调整容量,以适应元素的添加和删除。当vector的元素数量超过当前容量时,会自动增加容量以容纳更多元素。
#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec;

    std::cout << "Initial capacity: " << myVec.capacity() << std::endl;

    for (int i = 0; i < 10; ++i) {
        myVec.push_back(i);
        std::cout << "Vector capacity after adding " << i << ": " << myVec.capacity() << std::endl;
    }

    return 0;
}

输出结果:

Initial capacity: 0
Vector capacity after adding 0: 1
Vector capacity after adding 1: 2
Vector capacity after adding 2: 4
Vector capacity after adding 3: 4
Vector capacity after adding 4: 8
Vector capacity after adding 5: 8
Vector capacity after adding 6: 8
Vector capacity after adding 7: 8
Vector capacity after adding 8: 16
Vector capacity after adding 9: 16

在这个例子中,我们创建了一个名为myVec的空vector对象,并使用capacity()函数获取初始容量。然后,我们使用push_back()函数向vector添加元素,并使用capacity()函数获取每次添加元素后的容量。可以看到,当元素数量超过当前容量时,vector会动态调整容量以容纳更多元素,容量的增长规律可能是指数级的(取决于编译器)。


clear():清空向量中的所有元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	cout << "清空前" << endl;
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	cout <<"该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数
	vec.clear(); // 清空 vec 中的所有元素
	cout << "清空后" << endl;
	for (auto e : vec)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << "该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数
	return 0;
}

在这里插入图片描述


front():返回向量的第一个元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	int firstElement = vec.front(); // 返回 10
	cout << firstElement << endl;
	return 0;
}

在这里插入图片描述


back():返回向量的最后一个元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	int lastElement = vec.back(); // 返回 30
	cout << lastElement << endl;
	return 0;
}

在这里插入图片描述


insert():在指定位置插入一个或多个元素

int main()
{
	vector<int> vec = { 10, 20, 30 };
	vec.insert(vec.begin() + 1, 15); // 在索引为 1 的位置插入元素 15,vec 变为 {10, 15, 20, 30}
	for (auto e: vec)
	{
		cout << e << " ";
	}
	return 0;
}

在这里插入图片描述


erase():删除指定位置或指定范围的元素

int main()
{
	vector<int> vec = { 10, 20, 30 ,40, 50};
	vec.erase(vec.begin() + 1);
	vec.erase(vec.begin(), vec.begin() + 2); 
	for (auto e: vec)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


resize():调整向量的大小

int main()
{

	vector<int> vec = { 10, 20, 30 };
	vec.resize(5); // 将 vec 调整为包含 5 个元素,未指定的元素将被默认初始化
	for (auto e: vec)
	{
		cout << e << " ";
	}
	cout << endl;
	vector<int> vec1 = { 10, 20, 30 };
	vec1.resize(10, 9);//将vec1调整成10个元素,未被指定的元素 初始化成9
	for (auto e : vec1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述


swap():交换两个向量的内容

int main()
{
	vector<int> vec1 = { 10, 20 };
	vector<int> vec2 = { 30, 40 };
	cout << "交换前" << endl;
	for (auto e : vec1)
	{
		cout << e << " ";
	}
	vec1.swap(vec2); // 交换 vec1 和 vec2 的元素,vec1 变为 {30, 40},vec2 变为 {10, 20}
	cout << endl;
	cout << "交换后" << endl;
	for (auto e : vec1)
	{
		cout << e << " ";
	}
}

在这里插入图片描述


vector中operator[]

在C++的vector中,operator[]是用于访问并操作vector中的元素的重载运算符。它允许您使用索引来访问和修改vector中的特定元素。以下是对operator[]的使用示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec = {1, 2, 3, 4, 5};

    // 通过使用索引来访问和修改元素
    std::cout << "Element at index 2: " << myVec[2] << std::endl;
    myVec[3] = 10;
    std::cout << "Modified element at index 3: " << myVec[3] << std::endl;

    return 0;
}

输出结果:

Element at index 2: 3
Modified element at index 3: 10

在这个例子中,我们创建了一个名为myVecvector对象,并使用初始化列表初始化其元素。然后,我们使用operator[]来访问索引为2和3的元素,并分别输出它们的值。接下来,我们将索引为3的元素修改为10,并再次使用operator[]访问并输出修改后的值。

需要注意的是,operator[]没有边界检查,如果使用超出vector有效索引范围的索引进行访问,会导致未定义的行为。因此,在使用operator[]时,务必确保所使用的索引在vector的有效范围内。

此外,还可以将operator[]用于循环遍历vector中的元素:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVec = {1, 2, 3, 4, 5};

    // 使用operator[]遍历vector中的元素
    for (size_t i = 0; i < myVec.size(); ++i) {
        std::cout << "Element at index " << i << ": " << myVec[i] << std::endl;
    }

    return 0;
}

输出结果:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5

在这个例子中,我们使用operator[]在循环中遍历vector中的元素。通过递增索引变量i,我们可以依次访问vector中的元素,并输出它们的索引和值。


vector中嵌套vector的二维矩阵或多维数组

在C++中,可以使用vector嵌套vector来创建二维矩阵或多维数组。这种嵌套的vector可以用于存储和访问多个行和列的数据。

int main() {
    // 定义数组的大小
    int rows = 3;
    int cols = 4;

    // 创建一个二维vector
    std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));

    // 对二维vector进行赋值
    int count = 1;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = count++;
        }
    }

    // 打印二维vector的内容
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

在这里插入图片描述


好啦,今天的内容就到这里啦,下期内容预告vector的常见函数模拟实现,博主前段时间有点事情,后面这段时间会加班加点的更新!


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位接下来的每一天好运连连 💞💞

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单的利用有限脉冲响应(FIR)滤波器对心电信号进行降噪(Python)

代码很简单。 import numpy as np import matplotlib.pyplot as plt#------------------------Bandstop Filter Function------------------------ def bandstop(M,low,high,Fs):#50Hz removalk1 int( (low/Fs)*M) # index 22k2 int( (high/Fs)*M) # index 27#DC removalk0 …

【头歌】计算机网络DHCP服务器配置第四关配置路由器子接口答案

头歌计算机网络DHCP服务器配置第四关配置路由器子接口操作步骤 任务描述 本关任务&#xff1a;配置路由器的子接口。 操作要求 在第一关的拓扑图的基础上&#xff0c;配置路由器及 PC 机&#xff0c;具体要求如下&#xff1a; 1、打开路由器物理接口 F0/0 &#xff1b; 2、配置…

安全攻防三

一、IDS: 当黑客绕过了防火墙&#xff0c;你该如何发现&#xff1f; IDS &#xff08;Intrusion Detection System&#xff0c;入侵检测系统&#xff09; NIDS 内网中检测网络流量攻击 黑客如果已经进去内网&#xff0c;防火墙就没办法保护了 NIDS部署在交换机和路由器这些路…

基于Vue的自定义服务说明弹窗组件的设计与实现

基于Vue的自定义服务说明弹窗组件的设计与实现 摘要 随着技术的不断发展&#xff0c;前端开发面临着越来越高的复杂性和不断变化的需求。传统开发方式往往将整个系统构建为整块应用&#xff0c;这导致对系统的任何微小改动都可能触发整体的逻辑变更&#xff0c;从而增加了开发…

软件测试/测试开发丨学习笔记之Allure2测试报告

Allure2测试报告 1、使用 Allure2 运行方式-Python 1&#xff09;–alluredir 参数生成测试报告。 在测试执行期间收集结果 pytest [测试用例/模块/包] --alluredir./result/ (—alluredir这个选项 用于指定存储测试结果的路径)#生成在线的测试报告 allure serve ./result2…

第一个Flutter3项目

配置flutter国内源 首先&#xff0c;配置flutter的国内源&#xff1a; env:PUB_HOSTED_URL"https://pub.flutter-io.cn"; env:FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn"配置gradle国内源 修改gradle\wrapper\gradle-wrapper.properties…

埃隆·马斯克的 xAI 募集 60 亿美元,瞄准 AI 超级计算机|TodayAI

埃隆马斯克&#xff08;Elon Musk&#xff09;创立的人工智能公司 xAI 宣布成功募集了 60 亿美元的资金&#xff0c;用于推动其“首批产品推向市场&#xff0c;建立先进的基础设施&#xff0c;并加速未来技术的研发”。马斯克透露&#xff0c;xAI 目前的估值已达到 180 亿美元&…

kafka-消费者组-点对点测试

文章目录 1、点对点测试1.1、获取 kafka-consumer-groups.sh 的帮助信息1.2、列出所有的消费者组1.3、创建消费者1并指定组 my_group11.4、创建消费者2并指定组 my_group11.5、创建消费者3并指定组 my_group11.6、创建生产者发送消息到 my_topic1 主题 1、点对点测试 1.1、获取…

记.netcore部署到银河麒麟linux服务器过程详解

一.服务器配置 操作系统:银河麒麟桌面操作系统V10 CPU:intel i5 内存:16G 内核:5.10.0.8-generic 未激活 二.运行环境安装 .netcore 6.0 runtime时安装下载离线包 Download .NET 6.0 (Linux, macOS, and Windows) -下载完后进行解压 sudo su #提权 mkdir -p $HOME/…

LeetCode1161最大内层元素和

题目描述 给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层&#xff0c;而根节点的子节点位于第 2 层&#xff0c;依此类推。请返回层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个。 解析 在上一题&…

如何在线转换图片的格式?一键修改图片格式的方法

图片是日常生活和工作中的一种常用的内容展示类型&#xff0c;在使用图片的时候不同用途需要使用的图片格式也是不同的&#xff0c;比如我们手中有一张jpg格式图片&#xff0c;但是平台上传要求格式是png&#xff0c;那么怎样才能将jpg转png格式呢&#xff1f;下面将教大家图片…

乡村振兴的实践与探索:以生态优先、绿色发展为导向,推动农村人居环境整治,建设美丽宜居乡村

一、引言 随着我国经济社会的快速发展&#xff0c;乡村振兴成为了新时代的重要战略。在这一背景下&#xff0c;以生态优先、绿色发展为导向的乡村振兴模式成为了重要的实践方向。本文旨在探讨如何通过生态优先、绿色发展的理念&#xff0c;推动农村人居环境整治&#xff0c;建…

洁净环境测试标准、监测计划要点及风险评估注意事项

洁净区日常环境监测 洁净区环境监测作为污染控制策略&#xff08;CCS&#xff09;的重要组成部分&#xff0c;用于监测旨在将粒子和微生物污染风险降至最低的控制措施。下面内容&#xff0c;中邦兴业小编将与大家做个详细的分享。 环境监测计划 评估和定义粒子、微生物监测所…

智慧城市运维可视化:透视未来城市高效管理的新视窗

行业痛点 现代城市运维是一个复杂而庞大的系统&#xff0c;涉及到诸多方面&#xff0c;包括交通、环境、能源等等。然而&#xff0c;在城市运维中&#xff0c;存在着一些现实的痛点&#xff0c;给城市管理者带来了不小的压力和困扰&#xff1a; 1、交通拥堵 随着城市化进程的…

一文搞定jdk8升级到jdk11

一、背景 为什么要升级JDK11 性能 JDK11的G1的GC性能高很多&#xff0c;对比JDK8无论是性能还是内存占比都有很大的提升&#xff0c;业内各项数据指标也都表明JDK11的G1在应对突发流量的下的效果惊人&#xff1b; 版本兼容 Spring Boot 2.7.x及以后的版本将不再支持Java 8作为…

【分支控制(if-else判断)】单分支-双分支-多分支-嵌套分支

程序流程控制 在程序中, 程序运行的流程控制决定程序是如何执行的, 是我们必须掌握的, 主要有三大流程控制语句. 顺序控制 (简单)分支控制 (判断)循环控制 (循环) 一. 顺序控制 顺序控制介绍 程序从上到下逐行地执行, 中间没有任何判断和跳转. 顺序控制举例和注意事项 Java中…

【JavaEE初阶】HTTP协议|HTTP请求方法|GET|POST|GET和POST的区别|问题辨析

目录 认识"⽅法"(method) 1.GET⽅法 GET请求的特点 2.POST⽅法 POST请求的特点 &#x1f4a1;经典⾯试题:谈谈GET和POST的区别 &#x1f4a1;问题辨析&#xff1a; 3.其他⽅法 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂…

钉钉企业内部H5微应用或小程序之钉消息推送

钉钉简单的推送钉消息 一、钉钉准备工作 首先进入钉钉开放平台 你得有企业内部微应用或者小程序 没有创建的话去看我另一篇文章有说明 钉钉开放平台创建企业内部H5微应用或者小程序-CSDN博客 看不懂话也可以参考官方文档&#xff1a;创建应用 - 钉钉开放平台 二、开发的准备…

他用AI,抄袭了我的AI作品

《大话西游》里面有一句经典台词&#xff1a;每个人都有一个妈&#xff0c;但是“你妈就一定是你妈吗&#xff1f;” 用AI创作的艺术作品&#xff0c;也走进类似的困境&#xff1a;如何证明你用AI生成的作品&#xff0c;就是你的作品&#xff1f; 近日&#xff0c;腾讯科技独…

【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk

背景&#xff1a;部分客户需求将自己网站打包成app&#xff0c;供用户在浏览器安装使用、 网页网址快速生成app 准备材料操作流程第一步&#xff1a;打开HBuilder X新建项目第二步创建Wap2App项目第三步修改App图标第四步发布app第五步查看apk 准备材料 1.需要打包的网页 2.ap…