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

news2024/9/23 9:27:56

前言:在上一篇中我们讲到了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.coloradmin.cn/o/1706717.html

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

相关文章

IPC$横向移动

一. IPC$介绍和连接方式 1. IPC$介绍 IPC( Internet Process Connection)共享&#xff0c;是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。通过ipc$,可以与目标机器建立连接。利用这个…

css3 笔记02

目录 01 过渡 02 rotate旋转 03 translate函数 04 真正的3D 05 动画 06 阴影 07 自定义字体库 08 自定义动画库 01 过渡 过渡属性的使用: transition-property:要过渡的css属性名 多个属性用逗号隔开 过渡所有属性就写all transition-duration: 过渡的持续时间 s秒 …

网上3d全景虚拟交互展馆沉浸式体验让客户和使用者都满意

在数字化浪潮席卷而来的今天&#xff0c;3D场景网站已成为众多行业展现创意与实力的新舞台。然而&#xff0c;传统的3D建模软件往往因其复杂性和高门槛&#xff0c;让许多渴望创建逼真3D场景的用户望而却步。 幸运的是&#xff0c;华锐视点推出了搭建3D场景网站的编辑器——一款…

力扣hot100学习记录(七)

240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 题意 在二维矩阵中搜索是否存在一个目标值&#xff0c;该矩阵每一行每一列都是升序…

第四十一天 | 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉搜索树

题目&#xff1a;62.不同路径 1.二维dp数组dp[i][j]含义&#xff1a;到达&#xff08;i&#xff0c;j&#xff09;位置有dp[i][j]种方法。 2.动态转移方程&#xff1a;dp[i][j] dp[i - 1][j] dp[i][j - 1] 3.初始化&#xff1a;dp[0][j] 1, dp[i][0] 1 &#xff08;第一…

Verilog实战学习到RiscV - 1 : Yosys 综合

Yosys 综合 实例 一般 FPGA IDE 的第一步都是RTL 综合&#xff08;Synthesis&#xff09;。之后就能看到数字电路图了。然后可以做RTL 级的仿真模拟。 直接上代码&#xff0c;这里我们看一个简单的加法器来学习。 module adder(input [7:0] a,input [7:0] b, input …

免费使用知网下载文献

第一步&#xff1a;输入网址&#xff1a;https://digi.library.hb.cn:8443/#/&#xff08;或搜索湖北省图书馆&#xff09; 第二步&#xff1a;点击登录按钮。 第三步&#xff1a;使用手机 支付宝 扫描页面左侧二维码。 第四步&#xff1a;手机点击“电子读者证注册”。&…

Android Studio 所有历史版本下载

一、官网链接 https://developer.android.google.cn/studio/archive 操作 二、AndroidDevTools地址 https://www.androiddevtools.cn/ 参考 https://blog.csdn.net/qq_27623455/article/details/103008937

技术创新加速生态繁荣 | 软通动力子公司鸿湖万联亮相OpenHarmony开发者大会2024

5月25日&#xff0c;由开放原子开源基金会OpenHarmony项目群工作委员会主办的OpenHarmony开发者大会2024在深圳成功举行。本次大会紧扣OpenHarmony 4.1 Release版本发布契机&#xff0c;以“鸿心聚力&#xff0c;智引未来”为主题、通过“1场主论坛6场技术分论坛”承载&#xf…

UI卡片设计入门:一步步教你成功逆袭

UI卡片设计是目前流行的UI设计风格。UI卡片设计是对网页中的卡进行分析和重构的设计&#xff0c;那么在设计UI卡片时应该注意什么呢&#xff1f;目前流行哪种UI卡片设计&#xff1f;收集这个UI卡片设计避坑指南&#xff0c;菜鸟也可以反击成UI设计老板~ UI卡片是什么&#xff…

智慧管廊巡检运维解决方案

一、智慧管廊巡检行业目前存在的挑战和难题 智慧管廊巡检行业面临着运行环境的客观影响&#xff0c;如地面施工、液体渗漏、通风不佳、内部空间受限等问题。而管廊巡检机器人系统的出现却具有重大意义。它能够有力地保障管廊安全且可靠地运行&#xff0c;在面对火情、灾情等紧…

2024「618年中盛典」媒体邀约有哪些优惠活动?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 51媒体网2024年618 活动正式开启&#xff0c;也预示着2024传播季—年中盛典的到来&#xff0c;从即日起下单的客户&#xff0c;即可享受满减增等优惠政策&#xff0c;新客更享受折上折的…

养猫久了才知道,为什么宠物空气净化器是养猫必备!效果惊人!

养猫是一件非常愉快的事情&#xff0c;猫咪的陪伴能带给我们无尽的欢乐和温暖。然而&#xff0c;随着时间的推移&#xff0c;许多养猫的朋友会发现一个问题&#xff0c;那就是家中的空气质量变差了&#xff0c;猫毛、异味等问题也随之而来。这时候&#xff0c;一款好的宠物空气…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十二)- 微服务(2)

目录 4. Ribbon负载均衡 4.1 负载均衡流程 4.2 负载均衡策略 4.3 Ribbon饥饿加载 5. Nacos注册中心 5.1 服务注册到nacos 5.2 nacos服务分级存储模型 5.3 根据权重负载均衡 5.4 环境隔离--namespace 4. Ribbon负载均衡 4.1 负载均衡流程 4.2 负载均衡策略 默认实现是…

python基础知识:py文件转换为jupyter文件

搜索了很多&#xff0c;都没什么用&#xff0c;会出现一些json错误&#xff0c;最终直接新建文件成功: 在自己电脑安装Anaconda&#xff0c;安装jupyter notebook&#xff0c;输入命令打开jupyter notebook&#xff1a; 在Anoconda命令行中cd到自己要转换文件的地址&#xff0…

天正T20专业建筑v7.0~v10.0版本下载,天正T20专业建筑软件获取

利用AutoCAD这一全球知名的图形平台&#xff0c;我们成功研发出了最新一代的T20天正建筑软件V8.0。这款软件以其卓越的性能和专业化的功能&#xff0c;在建筑施工图设计领域展现出了强大的实力&#xff0c;赢得了广大建筑设计师的青睐。 T20天正建筑软件V8.0在继承了AutoCAD的稳…

【自动驾驶技术栈学习】2-软件《大话自动驾驶》| 综述要点总结 by.Akaxi

----------------------------------------------------------------------------------------------------------------- 致谢&#xff1a;感谢十一号线人老师的《大话自动驾驶》书籍&#xff0c;收获颇丰 链接&#xff1a;大话自动驾驶 (豆瓣) (douban.com) -------------…

Beego 使用教程 8:Session 和 Cookie

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 be…

AI架构设计7:TGI

这个专栏主要关注围绕着AI运用于实际的业务场景所需的系统架构设计。整体基于云原生技术&#xff0c;结合开源领域的LLMOps或者MLOps技术&#xff0c;充分运用低代码构建高性能、高效率和敏捷响应的AI中台。该专栏需要具备一定的计算机基础。 若在某个环节出现卡点&#xff0c;…

质量评估门户:您AI内容的质量守护者

在当今这个内容饥渴和内容疯狂的世界里&#xff0c;AI驱动的内容创作既是一种流行趋势&#xff0c;有时也是一个改变游戏规则的存在。但强大的能力伴随着巨大的责任……即确保质量的责任。 想象一下&#xff1a;你拥有一个AI[和创意团队]&#xff0c;他们以闪电般的速度输出博…