STL —— vector(1)

news2024/10/11 4:25:03
图片名称

博主首页: 有趣的中国人

专栏首页: C++专栏


    本篇文章主要讲解vector使用的相关内容

    1. vector简介

    vector 是 C++ 标准库中的一个容器类模板,它提供了动态数组的功能,可以方便地管理和操作元素的集合。下面是关于 vector 的一些基本信息:

    • 头文件: vector 定义在 头文件中,使用时需要包含该头文件。
    • 使用命名空间: vector 类定义在 std 命名空间中,因此需要使用 std::vector 或者在代码开头添加 using namespace std; 来简化使用。
    • 容器特点: vector 是一个序列式容器,它以动态数组的形式存储元素,并提供了在数组末尾快速插入和删除元素的功能。
    • 元素类型: vector 可以存储几乎任何类型的元素,例如整数、浮点数、对象或其他容器,只要这些类型满足一定的要求,例如可移动构造函数和析构函数等。
    • 动态大小: vector 允许动态分配和释放内存,可以根据需要动态调整大小,而无需手动管理内存。
    • 访问元素: 可以使用下标运算符 [] 或者 at() 方法访问 vector 中的元素。
    • 插入和删除: 可以使用 push_back() 方法将元素插入到 vector的末尾,使用 pop_back() 方法删除末尾的元素,还可以使用 insert() 方法在指定位置插入元素,使用 erase() 方法删除指定位置的元素。
    • 动态调整大小: 可以使用 resize() 方法动态调整 vector 的大小,增加或减少元素数量,还可以使用 reserve() 方法预留一定的容量,避免频繁的重新分配内存。
    • 遍历元素: 可以使用迭代器或者基于范围的 for 循环遍历 vector 中的元素。
    • 其他操作: vector 还提供了许多其他有用的方法,例如获取大小、判断是否为空、清空容器、交换容器等。

    vector 是 C++ 中常用的容器之一,它提供了灵活且高效的动态数组功能,适用于各种场景和用途。


      3. vector iterator 的使用

      类似的,vector的迭代器也分为正向和反向,const和非const,即

      • iterator
      • reverse_iterator
      • const_iterator
      • const_reverse_iterator

      1. iterator 示例
      void vector_test2()
      {
      	vector<int> v;
      	v.push_back(1);
      	v.push_back(2);
      	v.push_back(3);
      	v.push_back(4);
      	v.push_back(5);
      	vector<int>::iterator it = v.begin();
      	while (it != v.end())
      	{
      		cout << *it << " ";
      		++it;
      	}
      	cout << endl;
      	it = v.begin();
      	// 可修改
      	while (it != v.end())
      	{
      		++*it;
      		++it;
      	}
      	it = v.begin();
      	while (it != v.end())
      	{
      		cout << *it << " ";
      		++it;
      	}
      	cout << endl;
      
      }
      
      1. reverse_iterator 示例
      void vector_test3()
      {
      	vector<int> v;
      	v.push_back(1);
      	v.push_back(2);
      	v.push_back(3);
      	v.push_back(4);
      	v.push_back(5);
      	vector<int>::reverse_iterator it = v.rbegin();
      	while (it != v.rend())
      	{
      		cout << *it << " ";
      		++it;
      	}
      	cout << endl;
      	it = v.rbegin();
      	while (it != v.rend())
      	{
      		++*it;
      		++it;
      	}
      	it = v.rbegin();
      	while (it != v.rend())
      	{
      		cout << *it << " ";
      		++it;
      	}
      	cout << endl;
      }
      
      1. const_iterator 示例
      void vector_test4()
      {
      	const vector<int> v(10,10);
      	vector<int>::const_iterator it = v.begin();
      	while (it != v.end())
      	{
      		cout << *it << " ";
      		++it;
      	}
      	cout << endl;
      	// 不可修改
      	/*it = v.begin();
      	while (it != v.end())
      	{
      		++*it;
      		++it;
      	}*/
      }
      
      1. const_reverse_iterator 示例
      void vector_test5()
      {
      	const vector<int> v(10, 66);
      	vector<int>::const_reverse_iterator it = v.rbegin();
      	while (it != v.rend())
      	{
      		cout << *it << " ";
      		++it;
      	}
      	cout << endl;
      }
      

        3. vector 容量操作

        3.1 vector 空间增长问题

        对于 vector 的容量操作,重点有以下几个:

        • size
        • capacity
        • empty
        • resize


        可以用以下代码查看 vector 的空间增长

        void TestVectorExpand()
        {
        	size_t sz;
        	vector<int> v;
        	sz = v.capacity();
        	cout << "making v grow:\n";
        	for (int i = 0; i < 100; ++i)
        	{
        		v.push_back(i);
        		if (sz != v.capacity())
        		{
        			sz = v.capacity();
        			cout << "capacity changed: " << sz << '\n';
        		}
        	}
        }
        


        vs下使用的STL基本是按照1.5倍方式扩容。

        3.2 reserve 提前预留空间

        我们知道频繁扩容会对效率大大提高,因此当我们知道需要使用多少空间的时候,应当提前预留空间,用 reserve 函数即可。

        void TestVectorExpand()
        {
        	size_t sz;
        	vector<int> v;
        	sz = v.capacity();
        	v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容
        	cout << "making v grow:\n";
        	for (int i = 0; i < 100; ++i)
        	{
        		v.push_back(i);
        		if (sz != v.capacity())
        		{
        			sz = v.capacity();
        			cout << "capacity changed: " << sz << '\n';
        		}
        	}
        }
        

        3.3 size()、capacity()、resize()

        void vector_test6()
        {
        	vector<int> v(100, 66);
        	cout << v.size() << endl;
        	cout << v.capacity() << endl;
        	// 不会缩容
        	v.resize(50);
        	cout << v.capacity() << endl;
        	// 按照内存对齐的方式给空间
        	v.resize(120);
        	cout << v.size() << endl;
        	cout << v.capacity() << endl;
        }
        

          4.vector 的增删改查


          注意这里的insert() 有三种重载形式,而且在算法库

          iterator insert(iterator pos, const T& value);
          iterator insert(iterator pos, size_type count, const T& value);
          iterator insert(iterator pos, InputIterator first, InputIterator last);

          • pos 是插入的位置,类型为迭代器,表示插入元素的位置。
          • value 是要插入的元素值。
          • count 是要插入的元素个数。
          • first 和 last 是迭代器范围,表示要插入的元素序列的起始和结束位置。
          void vector_test7()
          {
          	vector<int> v;
          	v.push_back(1);
          	v.push_back(2);
          	v.push_back(3);
          	v.push_back(4);
          	v.push_back(5);
          
          	for (auto e : v)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          
          	//vector<int>::iterator pos = find(v.begin(), v.end(), 3);
          	auto pos = find(v.begin(), v.end(), 3);
          	if (pos != v.end())
          	{
          		v.insert(pos, 30);
          	}
          
          	// 头插
          	v.insert(v.begin(), 0);
          	for (auto e : v)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          
          	v.insert(v.begin() + 2, 0);
          	for (auto e : v)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          
          	string s("abcd");
          	v.insert(v.begin(), s.begin(), s.end());
          	for (auto e : v)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          }
          

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

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

          相关文章

          基于unbantu的nginx的配置

          目录 前言: 1.安装nginx并进行测试 1.1使用nginx -v 命令查看版本 1.2开启服务 查看端口 1.3测试 2.nginx的静态资源访问配置 2.1创建静态资源存放的目录 2.2写入目录中测试文件对应的内容 2.3修改配置文件 2.4 测试 3.虚拟主机配置 3.1创建目录 3.2写入测试…

          [flask]http请求//获取请求体数据

          import jsonfrom flask import Flask, requestapp Flask(__name__)app.route("/form1", methods["post"]) def form1():"""获取客户端请求的请求体[表单]:return:""""""获取表单数据请求url&#xff1a;&qu…

          【mysql】centos7安装mysql8

          目录 1. 下载安装包2. 解压tar包3. 安装4. 查看安装完成后的安装包5. 初始化mysql6. MySQL设置 1. 下载安装包 1.官网地址2.mysql-8.0.35-1.el7.x86_64.rpm-bundle.tar3.放到服务器的目录&#xff08;这里是/opt/mysql&#xff09; 2. 解压tar包 1.tar -xvf 可以解压tar.xz后…

          批量下载网页文章软件大全

          在信息爆炸的时代&#xff0c;网络上充斥着海量的文章和内容&#xff0c;有时我们希望能够批量下载网页上的文章&#xff0c;以便离线阅读或进行进一步处理。为了满足这一需求&#xff0c;出现了许多网页文章批量下载工具&#xff0c;它们能够帮助用户快速、方便地获取网页上的…

          【IC前端虚拟项目】write_path子模块DS与RTL编码

          【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 read_path的代码完成之后,就可以开始整个项目里复杂度最高、bug最多、时序收敛最为困难的模块——write_path的开发了!我自己写过两次这个虚拟项目,每次都是在这里耗时最久,所以大家也可以挑战一下自…

          使用AOP实现打印日志

          首先创建annotation.SystemLog类&#xff1a; package com.gjh.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD…

          蓝桥杯-卡片换位

          solution 有一个测试点没有空格&#xff0c;要特别处理&#xff0c;否则会有一个测试点运行错误&#xff01; 还有输入数据的规模在变&#xff0c;小心顺手敲错了边界条件 #include<iostream> #include<string> #include<queue> #include<map> #incl…

          JS new Array.fill(new Array()) 创建二维数组 fill方法的坑

          我们通常会通过如下方式来创建一个二维数据&#xff1a; const arr new Array(5).fill(new Array(2).fill(0))我们如果想要修改其中一个元素的值 arr[0][0] 1输出&#xff1a;   我们只想给arr[0][0]赋值&#xff0c;但是每一行数组为0的下标元素的值全部改变了&#xf…

          Mysql-实战数据备份与恢复

          文章目录 备份类型备份内容备份工具mysqldump备份 实战案例&#xff1a;恢复误删除的表准备工作2:30完全备份完全备份后更新数据表10:00误删students表需要恢复还原的状态开始还原恢复 为什么要备份&#xff1f; 备份是为了&#xff1a;灾难恢复&#xff1a;硬件故障、软件故障…

          基于springboot实现房屋租赁系统项目【项目源码+论文说明】计算机毕业设计

          基于springboot实现房屋租赁系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本…

          转型数据报表开发:奥威BI学习网站如何助你一臂之力?

          介绍&#xff1a;奥威BI是一款商业智能工具&#xff0c;专为中国企业设计&#xff0c;提供数据可视化分析功能。以下是关于奥威BI的一些详细信息&#xff1a; 自助式敏捷BI分析&#xff1a;用户可以通过简单的操作&#xff0c;如拖拉拽&#xff0c;制作出炫酷的可视化报表。这种…

          前端超分辨率技术应用:图像质量提升与场景实践探索-设计篇

          超分辨率&#xff01; 引言 在数字化时代&#xff0c;图像质量对于用户体验的重要性不言而喻。随着显示技术的飞速发展&#xff0c;尤其是移动终端视网膜屏幕的广泛应用&#xff0c;用户对高分辨率、高质量图像的需求日益增长。然而&#xff0c;受限于网络流量、存储空间和图像…

          【软件安装】(十四)Ubuntu22.04安装Psensor硬件监视器

          一个愿意伫立在巨人肩膀上的农民...... Ubuntu系统硬件运行查询输入指令太繁琐&#xff0c;终端展示不直观&#xff0c;因此这款具有可视化监控Ubuntu系统下当前电脑的硬件CPU&#xff08;中央处理器&#xff09;、GPU&#xff08;显卡&#xff09;和硬盘等温度等功能&#xff…

          HCIP(DSVPN)实验

          HCIP&#xff08;DSVPN&#xff09;实验 一&#xff0c;实验要求&#xff1a; 1、r5为isp&#xff0c;只能进行ip地址的配置&#xff0c;其所有ip地址均为共有ip地址 2、r1和r5使用ppp的PAP认证&#xff0c;r5为主认证方 r2和r5之间使用ppp的chap认证&#xff0c;r5为主认证方…

          vue基础教程(4)——十分钟吃透vue路由router

          同学们可以私信我加入学习群&#xff01; 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后&#xff0c;页面显示如下&#xff1a; 在这个页面中&#xff0c;点击Home和About都会切换右面的页面内容&#…

          HTML网站的概念

          目录 前言&#xff1a; 1.什么是网页&#xff1a; 2.什么是网站&#xff1a; 示例&#xff1a; 3.服务器&#xff1a; 总结&#xff1a; 前言&#xff1a; HTML也称Hyper Text Markup Language&#xff0c;意思是超文本标记语言&#xff0c;同时HTML也是前端的基础&…

          python实战之PyQt5桌面软件

          一. 演示效果 二. 准备工作 1. 使用pip 下载所需包 pyqt5 2. 下载可视化UI工具 QT Designer 链接&#xff1a;https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwdywct 提取码&#xff1a;ywct 3. 可视化UI工具汉化 把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看…

          小白python爬虫基础教程(看这一篇就完了)

          爬虫的五个步骤&#xff1a; 1&#xff09;需求分析&#xff0c;找到需求相关的网址 2&#xff09;获取网址的返回信息&#xff08;urllib,requests&#xff09; 3&#xff09;定位需要的信息所在位置&#xff08;re正则表达式,XPATH, CSS selector&#xff09; 4&#xff…

          开通幻兽帕鲁游戏多人联机服务器多少钱?价格意想不到

          2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

          在微信上处理小程序用户反馈具体的方法

          想必大家在开发小程序的时候&#xff0c;一定遇到这种情况&#xff1a; 为了用户有更好的体验&#xff0c;我们会定期登陆微信小程序来查看用户反馈并对用户的问题进行回复和处理&#xff0c;但是这种方法的缺点就是最多间隔48小时要进行登陆一次以及回复用户不及时。 这样的话…