std::vector简介及其使用(转)

2023-11-12

std::vector简介及其使用

本文中的vector指的是std::vector C++11标准。

Vector概述

template <class T,class Alloc = allocator <T> > class vector; //通用模板

  vector是表示可以改变大小的数组的序列容器。

  就像数组一样,vector使用连续存储空间存储元素,这意味着它们的元素也可以使用指向其元素的指针进行偏移来访问,并与数组一样高效。但与数组不同的是, vector的大小可以动态变化,并且是由容器自动处理的。

  在内部实现上,vector使用动态分配的数组来存储它们的元素。在插入新元素时,vector的大小增大,可能需要重新分配数组,这意味着可能要分配新数组并将原有数组中所有元素移动到这个新数组中。重新分配数组的时间成本相对高昂,因此,vector不会在每次向容器添加元素时都重新分配数组。vector容器可能会分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能比其包含的元素个数要大。不同库可以实现不同的增长策略以在使用现有内存和 重新分配内容之间取得平衡,但无论如何,重新分配内存时的数组大小应以对数增长,这样在vector末端插入单个元素时就可以得到平摊的常数时间复杂度。

  因此,与数组相比,vector消耗更多内存,以换取以更有效的方式管理存储空间。

  与其他动态序列容器(deques,lists和forward_lists)相比,vector可以非常高效地访问其元素(就像数组一样)并且相对高效地从其末尾添加或删除元素。 对于涉及在末尾以外的位置插入或删除元素的操作,性能比其他序列容器要差,并且与lists和forward_lists相比具有更少的迭代器和引用一致性。

容器属性

  • 顺序存储

   序列容器中的元素按照严格的线性顺序存储。各个元素通过使用它们在这个序列中的位置(index)来访问。

  • 动态数组

   允许直接访问序列中的任何元素,支持指针运算,相对快速的添加/删除序列末尾的元素。

  • 分配器

   容器使用allocator对象来动态处理其存储需求。

模板参数

  • T 

  元素的类型。只有当 T 保证在移动操作时不会抛出异常,实现才会进行优化,即在重新分配数组时移动元素而不是复制它们。

  别名为成员类型 vector :: value_type。

  • Alloc

  用于定义分配模型的分配器对象的类型。默认情况下,使用allocator类模板,该模板定义最简单的内存分配模型,并且与值无关。

  别名为成员类型 vector :: allocator_type。

成员类型

member type definition notes
value_type The first template parameter (T)
allocator_type The second template parameter (Alloc) defaults to: allocator<value_type>
reference value_type&
const_reference const value_type&
pointer allocator_traits<allocator_type>::pointer for the default allocator: value_type*
const_pointer allocator_traits<allocator_type>::const_pointer for the default allocator: const value_type*
iterator a random access iterator to value_type convertible to const_iterator
const_iterator a random access iterator to const value_type
reverse_iterator reverse_iterator<iterator>
const_reverse_iterator reverse_iterator<const_iterator>
difference_type a signed integral type, identical to: iterator_traits<iterator>::difference_type usually the same as ptrdiff_t
size_type an unsigned integral type that can represent any non-negative value of difference_type usually the same as size_t

成员函数

  •  (constructor) 构造函数
default (1)
explicit vector (const allocator_type& alloc = allocator_type());
fill (2)
explicit vector (size_type n);
vector (size_type n, const value_type& val,
        const allocator_type& alloc = allocator_type());
range (3)
template <class InputIterator>
vector (InputIterator first, InputIterator last,
        const allocator_type& alloc = allocator_type());
copy (4)
vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);
move (5)
vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);
initializer list (6)
vector (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());

   构造函数示例:

 构造函数示例

  •  (destructor) 析构函数
~vector();
  • operator= 赋值
copy (1)
vector& operator= (const vector& x);
move (2)
vector& operator= (vector&& x);
initializer list (3)
vector& operator= (initializer_list<value_type> il);
  •  迭代器相关
函数 函数原型 功能描述
begin iterator begin() noexcept; Return iterator to   beginning 
const_iterator   begin() const noexcept;
end iterator end() noexcept; Return iterator to   end 
const_iterator   end() const noexcept;
rbegin reverse_iterator rbegin()   noexcept; Return reverse   iterator to reverse beginning 
const_reverse_iterator   rbegin() const noexcept;
rend reverse_iterator rend()   noexcept; Return reverse   iterator to reverse end 
const_reverse_iterator   rend() const noexcept;
cbegin  const_iterator cbegin() const   noexcept; Return const_iterator to   beginning 
cend  const_iterator cend() const noexcept; Return const_iterator to   end 
crbegin  const_reverse_iterator crbegin() const noexcept; Return const_reverse_iterator to   reverse beginning 
crend  const_reverse_iterator crend()   const noexcept; Return const_reverse_iterator to   reverse end 

   迭代器示例:

 迭代器示例

  •  容器大小或容量相关
函数 函数原型 功能描述
size size_type size() const noexcept; Return size 
max_size size_type max_size() const   noexcept; Return maximum size 
resize void resize (size_type n); Change size 
void   resize (size_type n, const value_type& val);
capacity size_type capacity() const noexcept; Return size of allocated storage   capacity 
empty bool empty() const noexcept; Test whether vector is   empty 
reserve void reserve (size_type n); Request a change in   capacity 
shrink_to_fit  void shrink_to_fit(); Shrink to fit 

  示例:

 示例代码

  • 成员访问相关
函数 函数原型 功能描述
operator[] reference operator[] (size_type   n); Access element 
const_reference operator[] (size_type n) const;
at reference at (size_type n); Access element 
const_reference at (size_type n) const;
front reference front(); Access first   element 
const_reference front() const;
back reference back(); Access last   element 
const_reference back() const;
data  value_type* data() noexcept; Access data. Return value: A pointer to the first element in the array used internally by the vector.
const value_type* data() const noexcept;

  成员访问示例:

 成员访问示例

  • 添加、删除等修改相关操作
函数 函数原型 功能描述
assign template <class InputIterator>
void assign (InputIterator first, InputIterator last);
Assign vector content. Assigns new contents to the vector, replacing its current contents, and modifying its size accordingly.
void assign (size_type n, const value_type& val);
void assign (initializer_list<value_type> il);
push_back void push_back (const value_type& val); Add element at the end 
void push_back (value_type&& val);
pop_back void pop_back(); Delete last element 
insert iterator insert (const_iterator position, const value_type& val); Insert elements. Return value: An iterator that points to the first of the newly inserted elements.
iterator insert (const_iterator position, size_type n, const value_type& val);
template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);
iterator insert (const_iterator position, value_type&& val);
iterator insert (const_iterator position, initializer_list<value_type> il);
erase iterator erase (const_iterator position); Erase elements 
iterator erase (const_iterator first, const_iterator last);
swap void swap (vector& x); Swap content 
clear void clear() noexcept; Clear content 
emplace  template <class...   Args>
iterator emplace (const_iterator position, Args&&... args);
Construct and insert   element 
emplace_back  template <class...   Args>
void emplace_back (Args&&... args);
Construct and insert element at   the end 

   示例:

 示例代码

  • Allocator相关
函数 函数原型 功能描述
get_allocator allocator_type get_allocator()   const noexcept; Get allocator

重载的非成员函数

函数 函数原型 功能描述
relational operators template <class T, class Alloc>
bool operator== (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
Relational operators for vector
template <class T, class Alloc>
bool operator!= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
template <class T, class Alloc>
bool operator<  (const   vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
template <class T, class Alloc>
bool operator<= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
template <class T, class Alloc>
bool operator>  (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
template <class T, class Alloc>
bool operator>= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
swap template <class T, class Alloc>
void swap (vector<T,Alloc>& x, vector<T,Alloc>& y);
Exchange contents of vectors

特例

函数 函数原型 功能描述
vector<bool> template <class T, class   Alloc = allocator<T> > class vector; // generic template
template <class Alloc> class vector<bool,Alloc>;   // bool specialization
Vector of bool

   注:vector<bool>使用不慎可能会出问题,一般都建议不要使用。

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

std::vector简介及其使用(转) 的相关文章

  • 在派生自 Control 的 ASP.NET 自定义控件中呈现自关闭标记

    我正在开发 Facebook FBML 控件库 并希望创建类似于 ASP NET WebControls 库的 FBML 控件 我有一个默认处理渲染的基类 这是我的渲染方法 protected override void Render Ht
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 递归显式模板实例化可能吗?

    给定一个类似的模板 template
  • 查找周边上的点来表示边界/形状

    我有一个简单的二维网格 其格式为myGrid x y 我正在尝试找到一种方法来找到所选网格周围的周长 这样我就有了所选网格的形状 这是我的意思的一个例子 这里的想法是找到所有相关的 角点 也就是图像周边的红点 放入一个列表中 这样我就可以从
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • 带有 Prism 区域适配器的 AvalonDock

    我看到了一些关于 SO 的问题 但似乎没有一个适合我 我希望能够使用伟大的使用 Prism 4 但是 所有示例区域适配器均适用于 Avalondock 1 x 系列 我无法使其工作 有人有关于如何为 AvalonDock 的 LayoutD
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • 向量和常量

    考虑一下这个 void f vector
  • 如何在 ASP.NET MVC 中获取参数数组作为 GET / POST?

    如何最好地获取数组 item gt value 对作为 GET POST 参数 在 PHP 中 我可以这样做 网址 这得到的参数为 Array a gt Array one gt 100 two gt 200 有什么方法可以在 ASP NE
  • 我使用 tm/mktime 是否错误,如果没有,有解决方法吗?

    我认为下面的程序应该输出从公元 1 年到 1970 年每年第一天到 1970 年的秒数 前面是time t在编译它的系统上 CHAR BIT是一个宏 所以我认为你不能只是复制编译后的可执行文件并假设它是正确的 尽管实际上一切都使用 8 位c
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • 对嵌套属性使用 XmlAttributeOverrides

    我试图使用 XmlAttributeOverrides 来控制类序列化后哪些类属性出现在 xml 中 它适用于 根 类上的属性 但不适用于嵌套属性 这是一个简单的例子来说明我想要完成的任务 我的类层次结构如下 public class Ma
  • System.IndexOutOfRangeException:索引超出了数组的范围[重复]

    这个问题在这里已经有答案了 我正在开发一个 ATM 软件作为家庭作业 我想知道今天处理的交易总量 为此我编写了以下代码 public decimal getDayTransaction int accountid string date s
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效
  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 制作一份简单的网络地图(世博地图的配准和切割)

    其实我很早的时候就写过一篇 我的 2010世博地图1 0版发布 但没有和大家做明确的说明和制作方法 今天就和大家一起来分享地图配准和地图切割并进行网络发布的问题 其实就是以世博为例制作一份简单的网络地图 网络地图是以Google Maps
  • postgresql日期时间范围查询:一年前到现在日期时间范围

    获取当前时间方式 1 获取当前日期时间 SELECT CURRENT TIMESTAMP 2019 09 02 11 27 37 282 08 2 获取当前时间 SELECT CURRENT TIME 11 28 39 636 08 3 获
  • 【Unity 3D】学习笔记 - 粒子系统初探

    Particle System是Unity内用于制作特效的系统 相对比较复杂 粒子系统可以用来制作烟雾 蒸汽 火焰和其他雾化效果 添加粒子系统 GameObject gt Effect gt Particle System 添加一个粒子系统
  • Python使用历史数据模拟法计算投资组合VaR(数据来源为Tushare)

    Python如何使用历史数据模拟法计算投资组合VaR 数据来源为Tushare 本文数据可以点赞关注私信我获取 VaR Value at Risk 是一种常用的风险管理指标 用于衡量投资组合在特定时间内的最大可能损失 历史数据模拟法是一种计
  • Android:年过35岁的程序员还有出路吗,rxjava面试题

    通过上面网友们的分析 其实大家也看的出一个情况 领导选择用你的标准之一 一定是能力的大小 如果技术过硬 年龄从来不会是第一标准 还记得你第一次写代码的时候吗 那种难以抗拒的兴奋和激动 你说你不如年轻人敏捷了 不如他们聪明了 都不是 只是因为
  • C++转换函数

    一 定义 转换构造函数是将其他类型转化为当前class类型 反之 就是转换函数 转换函数的定义格式 operator type TODO return data operator 是 C 关键字 type 是要转换的目标类型 data 是要
  • 【学习笔记】编程规约

    概述 阿里Java开发手册对编程规约 异常日志 单元测试 安全规约 MySQL数据库 工程结构 设计规约进行了规范并且进行了开源 整个手册针对java程序的诞生过程进行较为全面的规范 并且有插件 P3C 进行检查 结尾附地址 即使不是jav
  • 剑指offer_第3题_从尾到头打印链表

    题目描述 输入一个链表 按链表值从尾到头的顺序返回一个ArrayList 链表结构 class ListNode def init self x self val x self next None 理解 什么是链表 python数据结构之链
  • C语言从字符串中提取数字

    利用正则表达式 参考 http blog csdn net yangbingzhou article details 51352648 include
  • 使用AD(Altium Designer)三年的笔记(虽然很口语化,但是好记性不如烂笔头嘛~开熏)

    AD使用心得 1 放置过孔阵列 首先在边角或中间放置一个过孔 选中此过孔 高亮显示 Ctrl C 此时光标变为大十字 将十字放在过孔的中心 左键 编辑 特殊粘贴 在弹出的复选框中选择前两项 2 怎样将PCB板的四个角画成圆弧形 Keepou
  • RXJS部分操作符解释

    RXJS部分操作符解释 div div
  • ftp服务器vsftpd的安装与配置[ubuntu, linux]

    Ubuntu下Ftp的软件有好多种 google一下 各种的一些大致特点 wu Ftp 比较老牌 但针对它的攻击比较多 设置比较麻烦 但功能比较强大 proFtpd 能实现wu Ftp以及server U的所有功能 安全性也较高 但比起vc
  • 重磅!最全面最好用的保险行业数据解决方案全面上线!

    随着数字化时代的到来 保险机构面临着直销平台客户转化率低 代理人员队伍低效的困境 为了解决这些问题 帆软保险行业数据解决方案使用科学的数据分析报表为你带来承保 保全 批改 理赔 续期 精算 投资等一整套的数据应用场景 帮助多家企业达到降本增
  • java Lambda表达式详解

    文章目录 一 背景 1 1语法 1 2函数式接口 二 Lambda的基本使用 2 1引子 2 2常见的使用方式 2 3语法小结 三 变量捕获 3 1 匿名内部类 3 2 匿名内部类的变量捕获 3 3Lambda的变量捕获 四 Lambda在
  • 【C++】关于STL容器删除erase问题

    对于容器vector set 最近在看阿秀的八股文pdf时发现一条似乎有点问题 于是做了实验 以vector和set为例 这两个容器的erase函数都会返回下一个元素的迭代器 但是顺序容器vector确实不能使用erase it 此时it指
  • Clion Messages 乱码

    使用clion 时 编译错误时 console 输出时有乱码 在 Editor gt General gt Console gt Default Encoding 里修改设置为UTF 8 就正常了
  • [运维] nginx不允许ip访问

    nginx不允许IP访问 编辑nginx conf文件 编辑server前如下所示 server listen 80 server name localhost charset koi8 r access log logs host acc
  • 开发板测试网口带宽方法

    由于项目需要 需对开发板千兆网口传输速率进行测试 开始想到的方法十分简单 直接在开发板上移植一个ftp服务器 然后利用Ubuntu上的ftp客户端进行文件传输 以测试网口文件传输速度 但这样做需要将测试文件放到SD卡中 而SD卡的文件传输速
  • torch::jit::load(model_path) 失败原因

    下面是Pytorch配套的视频教程 Pytorch 快速实战教程 0 Pytorch实战前言 哔哩哔哩 bilibili Pytorch 分割实战教程 介绍一个图像分割的网络搭建利器 Segmentation model PyTorch 哔
  • std::vector简介及其使用(转)

    std vector简介及其使用 本文中的vector指的是std vector C 11标准 Vector概述 template