vector的介绍

news2025/1/18 11:42:56
vector的介绍:(vector翻译是向量,但是表示的是顺序表)
vector是表示可以改变大小的数组的序列容器。
就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样有效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。
在内部,vector使用动态分配的数组来存储它们的元素。当插入新元素时,可能需要重新分配该数组以增加大小,这意味着分配一个新数组并将所有元素移至该数组。就处理时间而言,这是一项相对昂贵的任务,因此,vector不会在每次将元素添加到容器时重新分配。
相反,vector容器可能会分配一些额外的存储空间以适应可能的增长,因此容器的实际容量可能大于包含其元素所严格需要的存储空间(即其大小 )。库可以实施不同的增长策略来平衡内存使用和重新分配,但无论如何,重新分配应该只发生在对数增长的大小间隔上,以便可以为vector末尾的单个元素插入提供摊销常数时间复杂性(参见push_back)。
因此,与数组相比,vector消耗更多内存以换取管理存储和以有效方式动态增长的能力。
与其他动态序列容器(deques、list和forward_lists)相比,vector 访问其元素(就像数组一样)非常有效,并且从其末尾添加或删除元素也相对有效。对于涉及在结尾以外的位置插入或删除元素的操作,它们的性能比其他操作更差,并且迭代器和引用的一致性不如列表和forward_lists。
还是通过cplusplus.com的文档来学习,使用旧版的内容(右上角
vector是一个类模板,可以存储任意类型
vector和string差不多,学完了string再学vector会轻松一点
首先看构造函数:
这次的构造函数和string相比有一点不同,出现了很多没见过的类型表示方法,这些类型是由已知的类型typedef出来的,可以从Member functions上面的表格中找到对应的类型
这个是之前提到过的空间配置器(STL六大组件之一,也就是内存池,申请内存从内存池找更高效一点),这里的默认参数暂时不用管。alloc是在不想用STL中内存池,要用自己写的内存池的情况下使用的。
第一个是无参的,第四个是拷贝构造,剩下两个一会再说。
最常用的是第一个。
第二个构造函数,n表示容器大小,val表示初始化内容
第三个构造函数表示可以用迭代器区间初始化
还可以通过对迭代器加减来控制初始化区间。而且迭代器是模板类型,可以取任意类型的迭代器。比如vector<char>用string迭代器初始化。
vector的遍历方式同样也有三种:下标,迭代器,范围for
下面观察一下vector的增容机制
从结果来看大概是1.5倍扩容。Linux g++ SGI版本是2倍扩容。
单次增容越多,增容次数越少,效率越高。浪费的空间也越多。
单次增容少,增容次数越多,效率低下。
增容倍率的大小是效率与空间的平衡。
如果知道要存储多少数据,就可以通过reserve函数提前开好空间;
resize在开空间的同时还会初始化,再通过push_back插入数据不合适。
剩下的就是一些和string没什么太大区别的函数了
shrink_to_fit是缩容的函数,可以让capacity减小到和size一样大。这个要慎用,一是再存入数据要重新增容,二是这个函数是把数据存入新空间,释放原来空间来达到效果的。通常会选择用空间换时间,时间换空间的操作并不推荐,除非浪费的空间太大,否则一般不使用这个函数。
vector的insert和erase就无法通过下标进行操作了,这里要使用迭代器来操作。而且erase必须一个一个删除数据,或者给删除的区间,没有给一个位置,然后删除这个位置及位置之后的函数了。
vector和list是没有find函数的,原因在于算法库中有find函数,可以复用,包括之前的reverse(逆置)函数也在算法库中,需要包含头文件<algorithm>
还有其他算法函数,比如sort(排序)
参数时迭代器类型,迭代器也是有不同类型的。
排序算法,默认是升序。如果要排降序,涉及仿函数的知识(STL六大组件之一)。先把用法记住就行。
升序:sort(v.begin(), v.end());  这里有默认的仿函数
降序:sort(v.begin(), v.end(), greater<int>());  需要额外包含头文件<functional>    greater就是大于的意思,也就是降序
也可以通过对象来完成降序的功能:greater<int>()  g; sort(v.begin(), v.end(), g);
其他函数要么是和string几乎一样,要么以现在的知识量无法理解。
vector<char>和string也是存在区别的,比如一些函数接口的不同,如:vector是没有append函数的,也没有+=重载,所以储存字符串数据用string比较好。
下面来看看vector的OJ题
这个要是用C语言写就相当麻烦了,也能写,难度也没那么大,但不推荐。C语言刷这个的经历实在是一言难尽。
难点也就是vector<vector<int>>的遍历。
题解如下:
class Solution
{
public:
    vector<vector<int>> generate(int numRows)
    {
        vector<vector<int>> vv(numRows); //创建numRows个vector<int>类
        for (int i = 0; i < numRows; i++) //开好空间,完成所有1的赋值
        {
            vv[i].resize(i + 1);
            vv[i][0] = 1;
            vv[i][vv[i].size() - 1] = 1;
        }
        for (int i = 0; i < numRows; i++)
        {
            for (size_t j = 0; j < vv[i].size(); j++)
            {
                if (vv[i][j] == 0) //除1以外位置的赋值
                {
                    vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];
                     //vv[i]重载,返回第i个值,返回值是vector<int>类型,继续重载[j],找到对应值。
                }
            }
        }
        return vv;
    }
};

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

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

相关文章

前端代码规范配置

前端代码规范配置 涉及到了eslint、prettier、husky、lint-staged等工具包的使用。 代码规则校验 使用eslint定义代码风格 安装eslint并在.eslintrc.js文件中配置。 npm i eslint -D这个代码风格可以使用公司团队内的规范&#xff0c;如果没有可以在github中找到一些主流的…

主机访问不到虚拟机(centos7)web服务的解决办法

目录 一、背景 二、解决办法 2.1、配置虚拟机防火墙 2.2、修改虚拟机网络编辑器 一、背景 主机可以访问外网&#xff0c;虚拟机使用命令&#xff1a;curl http://网址&#xff0c;可以访问到web服务 &#xff0c;主机使用http://网址&#xff0c;访问不到虚拟机&#xff08…

TikTok掀动出海淘金潮

嘉晟迪科&#xff1a;在各行各业都已经卷成红海的今天&#xff0c;最稀缺的是什么&#xff1f;当然是增长。那么&#xff0c;增长在哪里&#xff1f;流量在哪里&#xff0c;需求就在哪里&#xff0c;增长也就在那里。 因为短视频风靡全球的流行&#xff0c;内容平台特别是短视频…

Python-web开发学习笔记(2)--- HTML基础

先回顾一下上一篇文章&#xff1a;Python-web开发学习笔记&#xff08;1&#xff09;--- HTML基础_python web开发笔记_尚拙谨言的博客-CSDN博客 中讲了哪几个常用的HTML标签&#xff1a; <head>&#xff1a;头声明 <title>&#xff1a;网页标题 <h1>~<h6…

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

深度学习实战四:全连接神经网络(基于Pytorch,含数据和详细注释)

文章目录 概念softmax与交叉熵反向传播计算机视觉工具包torchvision全连接神经网络实现多分类概念 神经网络的第一层为输入层,最后一层为输出层,中间的所有层都叫做隐藏层 在计算神经网络层数时,一般不计算输入层,比如: 该神经网络的层数为2。输入层神经元有3个,隐藏层…

redis缓存数据库的使用

一&#xff0c;什么是redis &#xff1f;为什么要用它&#xff1f; 简单介绍&#xff1a; Redis是开源的key-value缓存框架&#xff0c;由c语言编写&#xff0c;也是一款高性能的框架提供多种语言的API 。 SET 每秒11万次 取get每秒81000次。 数据完全存储在内存空间中&…

【C++从0到王者】第八站:模板初阶

文章目录 一、泛型编程二、函数模板1.函数模板概念2.函数模板格式3.函数模板的原理4.函数模板的实例化1.隐式实例化2.显示实例化 5.模板参数的匹配原则 三、类模板1.类模板的格式2.类模板的实例化 一、泛型编程 当我们在写一个交换程序的时候 按照我们之前的想法&#xff0c;我…

谷歌算法快讯0519:近日排名变化频繁,排名或许回温?

从上周末到现在&#xff0c;已经有人注意到排名似乎又有了新的变化&#xff0c;根据WebMaster World上的帖子[1]和业内大家的讨论来看&#xff0c;大家共同的认识是5月16日开始就已经有变化&#xff0c;并且在5月19日的SEMRush Sensor来看已经到达峰值。 有一些在3月份谷歌更新…

yomichan使用笔记

导入词典词典下载 键盘快捷键 Alt Insert 打开搜索页面。 Alt DeleteToggle 打开/关闭扩展。 搜索结果中提供以下快捷方式&#xff1a; Esc取消当前搜索。 Alt PgUpPage 向上浏览结果。 Alt PgDnPage 向下浏览结果。 Alt End 转到最后一个结果。 Alt Home 转到第…

zookeeper的安装使用

zookeeper的安装使用 一、下载安装 https://zookeeper.apache.org/ 点击 download 以我自己的安装为例,linux,3.8.0 准备3台linux服务器&#xff1a;192.168.10.128、192.168.10.129、192.168.10.130 1.上传解压 把apache-zookeeper-3.8.0-bin.tar.gz 上传到 /usr/local/zo…

力扣sql中等篇练习(二十五)

力扣sql中等篇练习(二十五) 1 最繁忙的机场 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # Write your MySQL query statement below WITH T as (SELECT t.airport_id,SUM(n) numFROM(SELECT departure_airport airport_i…

【C++进阶之路】内存管理

文章目录 一.内存管理1. 内存布局2. C的内存管理 ①内置类型② 自定义类型 3. operate new 与 operate delete ① 解读operate new源代码② 解读operate delete源代码 4. new和delete的基本原理①new对类对象②delete对类对象 拓展—— 深入理解delete[]和new[]对比 C和C内存…

Java数据类型之字符串

字符集/编码表 ex&#xff1a;ASCII码 字符char&#xff1a;单引号‘ ’引起来的单个字符 转义字符 \n 作用&#xff1a;换行&#xff0c;单引号引用&#xff01;&#xff01;&#xff01; 制表符 \t 作用&#xff1a;加上 \t 前面一共空8个 字符与编码的转换 1.直接输出字…

opencv_c++学习(十九)

一、图像间的距离变换 三种常用的距离计算方法&#xff1a; 欧式距离这里就不在解释。 街区距离&#xff1a;顾名思义&#xff0c;就类似于城市距离一样&#xff0c;并不是通过两点间的距离&#xff0c;而是我们从一个地点到达另一个地点的路程(横纵坐标差值之和)。 棋盘距离…

每日学术速递5.21

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Going Denser with Open-Vocabulary Part Segmenta 标题&#xff1a;通过开放式词汇部分分割变得更密集 作者&#xff1a;Peize Sun, Shoufa Chen, Chenchen Zhu, Fanyi Xiao, Pi…

代码随想录算法训练营第十三天|239. 滑动窗口最大值、347.前 K 个高频元素

滑动窗口最大值 题目链接&#xff1a;力扣 知识点&#xff1a;单调队列 解题思路&#xff1a; 需要一个队列&#xff0c;放进去窗口里的元素&#xff0c;然后随着窗口的移动&#xff0c;队列也一进一出&#xff0c;每次移动之后&#xff0c;队列告诉我们里面的最大值是什么…

Java基础-Java常用类1(包装类 + Object类)

本篇文章主要讲解Java的常用类 包装类Object类 希望能对你的复习以及面试有帮助,有错误请指正 , 感谢. 目录 包装类 Object类 Object 类的常见方法有哪些&#xff1f; 对象比较(hashcode和equals方法) 和 equals() 的区别 hashCode() 是什么 ? 有什么用&#xff1f; 那…

【数据分享】中国首套10米分辨率的建筑高度数据(tif格式)

建筑是城市最重要的构成要素&#xff0c;高密度高层数的建筑是城市区别于乡村的显著特征&#xff01;建筑数据也是我们在各项研究中都会使用到的数据&#xff01;之前我们分享过2020年全国90个城市市域范围的建筑体块数据&#xff08;可查看之前的文章获悉详情&#xff09;。 …

Ubuntu2004设置共享开发环境

我们都知道Linux操作系统是一个多用户的操作系统&#xff0c;由于大家在实际工作中很少接触到多用户环境&#xff0c;特别是在目前电脑硬件成本不断降低的情况下几乎每个从事IT行业的人员都有一台甚至多台个人PC&#xff0c;因此大家对多用户的理解并不深刻。 ChatGPT引燃了人…