C++ STL之vector用法总结

2023-10-29

转自:https://www.cnblogs.com/zhonghuasong/p/5975979.html

介绍

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。

用法

1. 头文件

#include<vector>

2. vector声明及初始化

vector<int> vec;        //声明一个int型向量
vector<int> vec(5);     //声明一个初始大小为5的int向量
vector<int> vec(10, 1); //声明一个初始大小为10且值都是1的向量
vector<int> vec(tmp);   //声明并用tmp向量初始化vec向量
vector<int> tmp(vec.begin(), vec.begin() + 3);  //用向量vec的第0个到第2个值初始化tmp
int arr[5] = {1, 2, 3, 4, 5};   
vector<int> vec(arr, arr + 5);      //将arr数组的元素用于初始化vec向量
//说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素,
//这个主要是为了和vec.end()指针统一。
vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值

3. vector基本操作

(1). 容量

  • 向量大小: vec.size();
  • 向量最大容量: vec.max_size();
  • 更改向量大小: vec.resize();
  • 向量真实大小: vec.capacity();
  • 向量判空: vec.empty();
  • 减少向量大小到满足元素所占存储空间的大小: vec.shrink_to_fit(); //shrink_to_fit

(2). 修改

  • 多个元素赋值: vec.assign(); //类似于初始化时用数组进行赋值
  • 末尾添加元素: vec.push_back();
  • 末尾删除元素: vec.pop_back();
  • 任意位置插入元素: vec.insert();
  • 任意位置删除元素: vec.erase();
  • 交换两个向量的元素: vec.swap();
  • 清空向量元素: vec.clear();

(3)迭代器

  • 开始指针:vec.begin();
  • 末尾指针:vec.end(); //指向最后一个元素的下一个位置
  • 指向常量的开始指针: vec.cbegin(); //意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。
  • 指向常量的末尾指针: vec.cend();

(4)元素的访问

  • 下标访问: vec[1]; //并不会检查是否越界
  • at方法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常
  • 访问第一个元素: vec.front();
  • 访问最后一个元素: vec.back();
  • 返回一个指针: int* p = vec.data(); //可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是是C++11的特性。

(4)算法

  • 遍历元素
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
    cout << *it << endl;
//或者
for (size_t i = 0; i < vec.size(); i++) {
    cout << vec.at(i) << endl;
}
  • 元素翻转
#include <algorithm>
reverse(vec.begin(), vec.end());
  • 元素排序
#include <algorithm>
sort(vec.begin(), vec.end()); //采用的是从小到大的排序
//如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法:
bool Comp(const int& a, const int& b) {
    return a > b;
}
sort(vec.begin(), vec.end(), Comp);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL之vector用法总结 的相关文章

  • so库的反编译,反汇编

    Linux APP SO的反汇编工具 ida Pro 可以反汇编app和SO库 有函数名 但是不能反编译到code这一级别 下载最强的反编译工具 ida Pro 6 4 Plus rar 还有这个反汇编工具 没用过 转自 http bbs
  • PHP学习笔记——加密解密

    一 MD5算法 MD5消息摘要算法 Message Digest Algorithm 是R Rivest设计的 它对输入的任意长度的消息进行运算 产生一个128位的消息摘要 随着穷举攻击和密码分析的发展 MD5算法已经不再那么流行了 1 算
  • Python 中 import 的机制与实现

    转自 http python jobbole com 82604 本文所涉及到的代码在github上 概述 Python 是一门优美简单 功能强大的动态语言 在刚刚接触这门语言时 我们会被其优美的格式 简洁的语法和无穷无尽的类库所震撼 在真
  • MD5 加密算法详细介绍

    MD5是什么 message digest algorithm 5 信息 摘要算法 经常说的 MD5加密 就是它 信息 摘要算法 在下载一下东西时 经常在一些压缩包属性里 看到md5值 而且这个下载页面 很可能会在某一个地方 写了一句 此文
  • Unity3D protobuf-net使用方式

    1 下载protobuf net 2 创建Unity工程 创建一个Plugins文件夹 将protobuf net解压把里面得protobuf net放到Plugins 3 创建一个名为mcs的文本文件 里面写上 unsafe 4 重启Un
  • 需要注意字节序的大端(big endian)和小端(little endian)的几种情景

    大端 big endian 在内存中 按照从最低有效字节到最高有效字节的顺序存储对象 即数据的高字节 保存在内存的低地址中 而数据的低字节 保存在内存的高地址中 小端 little endian 在内存中 按照从最高有效字节到最低有效字节的
  • linux shell 编程

    转自 http blog csdn net fpmystar article details 4183678 和 http blog csdn net buutterfly article details 6615162 在进行linux测
  • C++智能指针简单剖析

    转自 https www cnblogs com lanxuezaipiao p 4132096 html 导读 最近在补看 C Primer Plus 第六版 这的确是本好书 其中关于智能指针的章节解析的非常清晰 一解我以前的多处困惑 C
  • C++ STL之vector用法总结

    转自 https www cnblogs com zhonghuasong p 5975979 html 介绍 vector是表示可变大小数组的序列容器 就像数组一样 vector也采用的连续存储空间来存储元素 也就是意味着可以采用下标对v
  • 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域 其动机在于建立 模拟人脑进行分析学习的神经网络 最近研究了机器学习中一些深度学习的相关知识 本文给出一些很有用的资料和心得 Key Words 有监督学习与无监督学习 分类 回归
  • 理解CPU/寄存器/内存之间的关系

    转自 https blog csdn net qq 27689785 article details 82975575 CPU 寄存器 内存 因为要了解多线程 自然少不了一些硬件知识的科普 我没有系统学习过硬件知识 仅仅是从书上以及网络上看
  • R与SPSS、SAS相比较_Python 在数据分析工作中的地位与R语言、SAS、SPSS 比较如何?

    转自 http m elecfans com article 611407 html 统计分析的软件和程序分析 能够用来做统计分析的软件和程序很多 目前应用比较广泛的包括 SPSS SAS R语言 Matlab S PLUS S Miner
  • C/C++编程笔记:C++中的指针与引用,又在什么时候使用?

    C和C 支持与大多数其他编程语言不同的指针 其他语言包括C Java Python Ruby Perl和PHP 从表面上看 引用和指针非常相似 都用于使一个变量提供对另一变量的访问 两者都提供了许多相同的功能 因此通常不清楚这些不同机制之间
  • QT学习——QFileSystemModel与QTreeView显示文件夹下的文件信息

    最近因为项目需求 使用QT做界面 新手学习 记录一些笔记 虽然QT已经做好了标准对话框的国际化 但是有时候对于中文的翻译可能达不到我们期望的 所以就需要我们自己来修改 比如下面的代码中 利用了国际化 写在main函数中 QApplicati
  • unique_ptr的使用和陷阱

    转自 https blog csdn net qq 33266987 article details 78784286 unique ptr的使用 分配内存 与shared ptr不同 unique ptr没有定义类似make shared
  • make时遇到File `Makefile' has modification time 4e+04 s in the future的解决办法

    1 原因 是虚拟机时间和电脑时间不匹配造成 2 解决办法 在VMware 菜单虚拟机 M gt 设置 S gt 选项下设置开启时间同步 然后重启虚拟机 3 若还出现 warning Clock skew detected Your buil
  • 24时区来源,CST,CET,UTC,DST,Unix时间戳概述、关系、转换

    全球24个时区的划分 相较于两地时间表 显示世界各时区时间和地名的世界时区表 Universal WorldTime 就显得精密与复杂多 通常世界时区表的表盘上会标示着全球24个时区的城市名称 全球24个时区是如何产生的 过去世界各地原本各
  • C++11的时间新特性之high_resolution_clock

    转自 https blog csdn net cw hello1 article details 66476290 我在这里只是说一说high resolution clock的时间用法 这里有一个C 的网上的API地址 包含了C 11的新
  • C++回顾——引用和拷贝构造函数

    一 C 中的指针 C和C 指针的最重要的区别在于C 是一种类型要求更强的语言 C不允许随便地把一个类型的指针赋值给另一个类型 但允许通过void 来实现 C 不允许这样做 如果真想把某种类型当做别的类型处理 则必须显示地使用类型转换 二 C
  • 开源软件许可证—GPL、AGPL、LGPL、Apache、ZLIB/LIBPNG、MIT

    转自 http www dushibaiyu com 2013 08 E5 BC 80 E6 BA 90 E8 BD AF E4 BB B6 E8 AE B8 E5 8F AF E8 AF 81 gpl E3 80 81agpl E3 80

随机推荐

  • JavaScript 教程 (详细 全面)

    文章目录 JavaScript 是什么 JavaScript 简介 1 JavaScript 的历史 2 JavaScript 与 ECMAScript 的关系 3 如何运行 JavaScript 4 JavaScript 具有以下特点 N
  • 题目:根据当月利润,求应发放奖金总数

    题目描述 企业发放的奖金根据利润提成 利润低于或等于10万元时 奖金可提10 利润高于10万元 低于20万元时 低于10万元的部分按10 提成 高于10万元的部分 可提成7 5 20万到40万之间时 高于20万元的部分 可提成5 40万到6
  • 【Docker】Docker容器管理

    1 容器外部操作 1 通过实训平台进入到操作系统界面 在 后输入sudo docker run ubuntu 14 04 bin echo Hello world 命令 然后按Enter键 启动一个ubuntu容器 会输出 Hello Wo
  • 软件测试人员的职业发展路径和技术路线规划

    软件测试人员应该如何规划自己的职业发展路径 如何规划自己的技术路线 下面是我整理的两张图 大家可以参考这两张图 结合自已目前所处的技术水平阶段 自己的性格和特长 去提前定位个人的职业发展方向 规划下一步学习的内容 目录 一 技术路线图 准新
  • redis必杀命令:字符串(String)

    题记 Redis 字符串数据类型的相关命令用于管理 redis 字符串值 基本语法如下 redis 127 0 0 1 6379 gt COMMAND KEY NAME 字符串命令 序号 命令及描述 1 SET key value 设置指定
  • 贵金属白银行情走势图缘何强势?

    自从去年12月中以来 国际现货白银价格已经从底部抬升超过10 许多抓对行情节奏的投资者已经赚到了相当不俗的收益 但作为有专业素养的投资者 必须明白行情运行背后的逻辑 才能在日后的交易中再次占得先机 根据瑞士信贷2017全球财富报告 去年全球
  • VS code For win7 最后支持的一个版本是 1.70.3

    VS code For win7 最后支持的一个版本是 1 70 3 原本地址是 https update code visualstudio com 1 70 2 win32 x64 stable 实际地址 https az764295
  • 解决在Android studio的Button控件下background背景设置不起作用的问题

    Button控件默认的背景是深紫色的 想要修改背景色所以添加了background字段 但是又不起作用 其实是themes xml文件里的 style 标签 的 parent 属性设置不对
  • CentOS7设置IPv4&IPv6

    进入网卡目录 1 cd etc sysconfig network scripts 修改ONBOOT yes 2 vi ifcfg ens33 TYPE Ethernet PROXY METHOD none BROWSER ONLY no
  • 移动端异构运算技术 - GPU OpenCL 编程(基础篇)

    一 前言 随着移动端芯片性能的不断提升 在移动端上实时进行计算机图形学 深度学习模型推理等计算密集型任务不再是一个奢望 在移动端设备上 GPU 凭借其优秀的浮点运算性能 以及良好的 API 兼容性 成为移动端异构计算中非常重要的计算单元 现
  • angular API

    angular API bind bootstrap copy uppercase lowercase fromJson toJson element noop identity angular bind 返回一个调用self的函数fn s
  • Python中MNE库的事件相关特定频段分析(MEG数据)

    最近做运动想象分类的时候遇到一个问题就是分类结果始终不准 想从原始数据分析一下脑电数据 找了下MNE提供的examples 里面还真有一个按频带分析的例子 说实话打开这个例子最主要的原因是这个图看着比较牛 后面的主要内容就是分析这个例子的实
  • 服务器防火墙开启后打不开网站,防火墙开启后windows电脑上不了网怎么办_网站服务器运行维护...

    windows xp是什么操作系统 网站服务器运行维护 windows xp是microsoft推出的供个人电脑使用的操作系统 包括商用及家用的台式电脑等 windows xp是微软首个面向消费者且使用windows NT5 1架构的操作系
  • LeetCode 剑指 Offer 18. 删除链表的节点

    目录结构 1 题目 2 题解 1 题目 给定单向链表的头指针和一个要删除的节点的值 定义一个函数删除该节点 返回删除后的链表的头节点 注意 此题对比原题有改动 示例 输入 head 4 5 1 9 val 5 输出 4 1 9 解释 给定你
  • python进行groupby分组的问题记录

    groupby的时候直接简单分组会发现数据不是平铺的 天的数据累加 def sum day data 01 07 FIELDS GROUP BY account id plan id data 01 07 data 01 07 accoun
  • Cesium教程(四):调用地形服务

    Cesium提供了多种现有地形数据服务接口 并且支持自定义地形数据 CesiumTerrainProvider 高精度全球地形数据 附有光照和水面效果 地形切片使用quantized mesh v1 0格式 Cesium使用CesiumTe
  • Maven项目中 “错误: 找不到或无法加载主类" 的解决办法

    在创建maven项目时 在下图的 Output folder None 说明没有指定编译后 class 文件存放的路径 所以在run java application报 错误 找不到或无法加载主类 解决这个问题操作步骤如下 在项目上右键 b
  • Intellij IDEA常用设置

    对于刚开始用IDEA或者重装系统后 这是一份比较好的手册 以下设置都是通过 File gt Settings 进入设置 打开IDEA时选择要打开的项目 以及打开项目时在新窗口打开 Appearance Behavior 外观与行为 gt S
  • 基于matlab代码的BP神经网络模型(多输出单输出、多输入多输出、离线训练与在线调用)

    BP神经网络在处理多输入多输出非线性问题上具有一定的优势 其应用目前较为成熟 具体主要分为以下步骤 1 数据读取 2 划分训练集 测试集 3 输入输出 隐层数量 节点数量设置 4 数据归一化 5 构建网络与参数配置 6 模型训练 7 反归一
  • C++ STL之vector用法总结

    转自 https www cnblogs com zhonghuasong p 5975979 html 介绍 vector是表示可变大小数组的序列容器 就像数组一样 vector也采用的连续存储空间来存储元素 也就是意味着可以采用下标对v