C++头文件容器库——vector

2023-10-27

vector的使用,首先添加头文件 #include <vector>

vector 是封装动态数组的顺序容器。元素相继存储,不仅可通过迭代器,还能用指向元素的常规指针访问元素。vector 的存储是自动管理的,按需扩张收缩; vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长; vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。

1. 赋值函数

1.1 操作(operator) “=”

函数接口(c++20):

constexpr vector& operator=( const vector& other );

函数作用:将 other 中的 vector 赋值给 “=” 之前的 vector;不是地址引用,是赋值重建;

常规使用示例:

vector<int>& nums1 = {3, 1, 4, 6, 5, 9};
vector<int>& nums2;
nums2 = nums1;			//nums2 = {3, 1, 4, 6, 5, 9};

// 移动赋值
vector<int>& nums3;
nums3 = move(nums1);		//nums3 = {3, 1, 4, 6, 5, 9}; nums1={}

1.2 assign(将值赋给容器)

函数接口(c++20):

1.2.1 以 count 份 value 的副本替换内容。

constexpr void assign( size_type count, const T& value );

参数含义:

  • count - 容器的新大小;
  • value - 用以初始化容器元素的值 ;

常规使用示例:

vector<char> characters;
characters.assign(5, 'a');		//characters={'a','a','a','a','a'}

1.2.2 以范围 [first, last) 中元素的副本替换内容。

constexpr void assign( InputIt first, InputIt last );

参数含义: first, last - 复制来源元素的范围

说明:若 InputIt 为整数类型,则此重载与1.2.1拥有相同效果。

常规使用示例:

vector<char> characters;
characters.assign({'C', '+', '+', '1', '1'});	// characters = “C++11”

1.3 vector的初始化

1.3.1 默认初始化

vector<int> test1;			//构造一个空的vector容器

vector<int> test(7);		//test={0,0,0,0,0,0},构造大小为7,其中值为0的vector容器

vector<int> list(7,3);		//list={3,3,3,3,3,3,3}

1.3.2 赋值构造

vector<int> list = {1,2,3,4,5,6,7};
vector<int> list{1,2,3,4,5,6,7};

vector<int> list;
list.assign(7,3);		//list={3,3,3,3,3,3,3}

1.3.3 通过数组构造

int a[] ={1,2,3,4,5};
vector<int>list(a,a+5);	
// (a,a+5)的含义为:a[0]-a[4];
//list3={1,2,3,4,5};

1.3.4 拷贝构造

vector<int> list1 = {1,2,3,4,5,6,7};

vector<int> list2(list1);		//list2 = {1,2,3,4,5,6,7};
等价于
vector<int> list2 = list1;

vector<int> list3(list1.begin()+2, list1.end()-1);		// list3={3,4,5,6}

2. 访问函数

2.1 访问指定元素

vector<int> data = { 1, 2, 4, 5, 7, 6 };
data[0];		// 1
data[4];		// 7

2.1.1 at —— 访问指定的元素,同时进行越界检查

函数接口(c++20):

constexpr reference at( size_type pos );

参数含义:pos - 要返回的元素的位置 ;
函数作用:

  • 返回位于指定位置 pos 的元素的引用,有边界检查;
  • 若 pos 不在容器范围内,则抛出 out_of_range 类型的异常;
  • 返回到所需元素的引用。

常规使用示例:

vector<int> data = { 1, 2, 4, 5, 5, 6 };
data.at(1) = 88;
data.at(6) = 666;			//索引 pos超限,报错
// data = { 1, 88, 4, 5, 5, 6 };

2.2.2 访问首尾元素

vector<int> data = { 1, 2, 4, 5, 5, 6 };

1.首元素
data.front();			// 1

2. 尾元素
data.back();			// 6

3. 迭代器

3.1 正向迭代器

在这里插入图片描述

函数接口

1. 返回指向 vector 首元素的迭代器:
constexpr iterator begin() noexcept;		// 注意:若 vector 为空,则返回的迭代器将等于 end();

2. 返回指向 vector 末元素后一元素的迭代器:
constexpr iterator end() noexcept;

使用案例:

vector<int> nums;
sort(nums.begin(), nums.end());

3.2 逆向迭代器

在这里插入图片描述

函数接口

1.返回指向第一个元素之前一个位置的反向迭代器。
constexpr const_reverse_iterator rend() const noexcept;

2.返回指向最后一个元素的反向迭代器;
constexpr const_reverse_iterator rbegin() const noexcept;

使用案例:

vector<int>values{1,2,3,4,5};
auto first = values.rbegin();
auto end = values.rend();
while (first != end)
{
	cout << *first << " ";
	++first;
}
// 5 4 3 2 1

4. 容量大小操作

4.1 检测是否为空

若容器为空则返回 true ,否则返回 false

vector<int>values1{1,2,3,4,5};
vector<int>values2;

bool label1 = values1.empty();		// false
bool label2 = values1.empty();		// true

4.2 元素数量

vector<int>values1{1,2,3,4,5};
int n = values1.size();		// 5

4.3 改变容器中可存储元素的个数

函数接口(c++20):

1.重设容器大小以容纳 count 个元素,后附额外的默认插入的元素
constexpr void resize( size_type count );

2.重设容器大小以容纳 count 个元素,后附额外的 value 的副本元素

constexpr void resize( size_type count, const value_type& value );

注意:若当前大小大于 count ,则减小容器为前 count 个元素。

常规使用示例:

vector<int> c = {1, 2, 3};
c.resize(5);		// 1,2,3,0,0
c.resize(7,6);		// 1,2,3,0,0,6,6
c.resize(2);		// 1,2

4.4 存储空间

4.4.1 预留存储空间

函数接口(c++20):

constexpr void reserve( size_type new_cap );	// new_cap 	- 	vector 的新容量 

作用:

  • 增加 vector 的容量达到 new_cap;
  • 若 new_cap 大于当前的 capacity() ,则分配新存储,否则该方法不做任何事;
  • reserve() 不更改 vector 的 size;
  • 若 new_cap 大于 capacity() ,则所有迭代器,包含尾后迭代器和所有到元素的引用都被非法化。否则,没有迭代器或引用被非法化。

使用案例:

vector<int>values(7);		// values的容量为 7
values.reverse(100);		// values的容量为 100

4.4.2 返回当前存储空间能够容纳的元素数

函数接口(c++20):

constexpr size_type capacity() const noexcept;

使用案例:

vector<int>values1;	
vector<int>values2(7);	
values1.
int num = values1.capacity(); 	// 0
int num = values2.capacity(); 	// 7

4.4.3 释放未使用的内存

函数接口(c++20):

constexpr void shrink_to_fit();

作用:

  • 请求移除未使用的容量;
  • 它是减少 capacity() 到 size()非强制性请求,请求是否达成依赖于实现;
  • 若发生重分配,则所有迭代器,包含尾后迭代器,和所有到元素的引用都被非法化。若不发生重分配,则没有迭代器或引用被非法化。

使用案例:

vector<int> list;
list.capacity();		// 0

list.resize(100);
list.capacity();			// 100

list.resize(50);
list.capacity();			// 100

list.shrink_to_fit();
list.capacity();			// 50

5. 内容修改

5.1 清除元素

5.1.1 清除全部元素

函数接口(c++20):

constexpr void clear() noexcept;

作用:

  • 从容器擦除所有元素,此调用后 size() 返回零;
  • 非法化任何指代所含元素的引用、指针或迭代器。任何尾后迭代器亦被非法化;
  • 保持 vector 的 capacity() 不变。

使用案例:

vector<int>values{1,2,3,4,5};	
values.size();		// 5

values.clear();		//values={}
values.size();		// 0
values.capacity();		// 5

5.1.2 擦除元素

函数接口(c++20):

1.移除位于 pos 的元素
constexpr iterator erase( const_iterator pos );

2.移除范围 [first; last) 中的元素
constexpr iterator erase( const_iterator first, const_iterator last );

注意:

  • 能以 end() 迭代器为 pos 的值;
  • 擦除空范围是无操作

返回值:最后移除元素的迭代器。

  • 若 pos 指代末元素,则返回 end() 迭代器;
  • 若在移除前 last == end() ,则返回更新的 end() 迭代器;
  • 若 [first, last) 为空范围,则返回 last

使用案例:

vector<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
c.erase(c.begin());		// 1, 2, 3, 4, 5, 6, 7, 8, 9
c.erase(c.begin()+2, c.begin()+5);		// 1, 2, 6, 7, 8, 9

5.1.3 移除末尾元素

函数接口(c++20):

constexpr void pop_back();		//移除容器的末元素。

使用案例:

vector<int> c{6, 7, 8, 9};
c.pop_back();		// 6,7,8

5.2 构造元素

5.2.1 插入元素

函数接口(c++20):

1.在 pos 前插入 value
constexpr iterator insert( const_iterator pos, const T& value );

2.在 pos 前插入 count 个 value
constexpr iterator insert( const_iterator pos, size_type count, const T& value );
                           
3.在 pos 前插入 InputIt的[first,last)元素 
constexpr iterator insert( const_iterator pos, InputIt first, InputIt last );

4.在 pos 前插入 ilist 的元素
constexpr iterator insert( const_iterator pos, std::initializer_list<T> ilist );

参数含义:

  • pos - 将内容插入到其前的迭代器。 pos 可为 end() 迭代器;
  • value - 要插入的元素值;
  • count - 要插入的元素数量;
  • first, last - 要插入的元素范围,不能是指向调用 insert 所用的容器中的迭代器 ;
  • ilist - 要插入的值来源的list ;

指向被插入 value 的迭代器。

常规使用示例:

vector<int> vec(3,100);		// 100,100,100

vec.insert(vec.begin(), 200);		// 200,100,100,100

vec.insert(vec.begin(),2,300);		// 300,300,200,100,100,100

vector<int> vec2(2,400);
auto it = vec.begin();
vec.insert(it+1, vec2.begin(), vec2.end());	// 300,400,400,300,200,100,100,100

int arr[] = { 501,502,503 };
vec.insert(vec.begin(), arr, arr+3);	// 501,502,503,300,400,400,300,200,100,100,100

5.2.2 原位构造元素

函数接口(c++20):

直接在 pos 前插入元素,返回指向被安置的元素的迭代器。 
constexpr iterator emplace( const_iterator pos, Args&&... args );
// 其中,pos为构造新元素到其前的迭代器 

注意:若新的 size() 大于 capacity() ,则所有迭代器和引用都被非法化。否则,仅在插入点前的迭代器和引用保持合法。尾后迭代器亦被非法化。

使用案例 :

vector<int> myvector = {10,20,30};
auto it = myvector.emplace ( myvector.begin()+1, 100 );		// 10,100,20,30
myvector.emplace ( it, 200 );		// 10,200,100,20,30
myvector.emplace ( myvector.end(), 300 );		// 10,200,100,20,30,300

5.2.3 将元素添加到容器末尾

函数接口(c++20):

constexpr void push_back( const T& value );

使用案例:

vector<int> myvector = {10,20,30};
myvector.push_back(50);		// 10,20,30,50

5.2.4 在容器末尾就地构造元素

函数接口(c++20):

constexpr reference emplace_back( Args&&... args );

使用案例:

vector<int> myvector = {10,20,30};
myvector.emplace_back(50);		// 10,20,30,50

5.3 区别

5.3.1 insertemplace 的区别

insert是插入一个完全的对象,而emplace是先调用该对象的构造函数生成的对象,再把这个对象插入vector中。

使用emplace时,该对象类必须有相应的构造函数;

emplace 最大的作用是避免产生不必要的临时变量。

5.3.2 push_backemplace_back 的区别

push_back()方法要调用构造函数和复制构造函数,这也就代表着要先构造一个临时对象,然后把临时的copy构造函数拷贝或者移动到容器最后面;

emplace_back()则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。

6. 两个vector 之间的内容交换

函数接口(c++20)

将内容与 other 的交换,不在单个元素上调用任何移动、复制或交换操作。
constexpr void swap( vector& other ) noexcept(/* see below */);

使用案例:

vector<int> a1{1, 2, 3};
vector<int> a2{4, 5};
a1.swap(a2);
// a1 = {4, 5}; 
// a2 = {1, 2, 3};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++头文件容器库——vector 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • 深拷贝和动态转换 unique_ptr

    假设我有一个如下所示的类 class A virtual A class B public A class C public A 我还有一个 unique ptr 向量 它是这样声明的 std vector
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • .NET 5 EF Core SaveChangesAsync 因错误而挂起

    尽管这个问题有很多结果 但没有一个真正给我明确的答案 每次我尝试通过 AddAsync 和 SaveChangesAsync 方法插入错误数据 例如重复的主键 时 我都会看到以下日志 执行 DbCommand 失败 15 毫秒 我还在 SQ
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • C 变量声明的效率 [重复]

    这个问题在这里已经有答案了 例如 在 C 中声明一个变量需要多长时间int x or unsigned long long var 我想知道它是否会让我的代码在类似的事情中更快 for conditions int var 0 code 这
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int

随机推荐

  • 2018年Android最新面试题(一)

    最近在忙着找工作 所以趁热打铁写一份Android最新的面试题 希望可以帮助到大家 一直被问的问题Glide的源码 重点 最好和Picasso比较着说 Glide原理 自己看 https www jianshu com p 3d699bf0
  • APP过度索取问题严重,该如何有效解决?

    近几年移动应用市场发展快速 APP种类功能繁多 给人们的生活和工作带来了无限便捷 然而事物的发展必然有对立面 APP获取用户数据问题突出 同时加大了信息泄露的风险 工信部及各通信管理局等相关部门针对APP问题频频通报 使得移动应用开发商处于
  • 封闭岛屿数量 -- 二维矩阵的dfs算法

    1254 统计封闭岛屿的数目 这道题和 岛屿数量 二维矩阵的dfs算法 类似 区别在于不算边缘部分的岛屿 那其实很简单 把上 题中那些靠边的岛屿排除掉 剩下的就是 封闭岛屿 了 关于岛屿的相似题目 岛屿数量 二维矩阵的dfs算法 封闭岛屿数
  • openEuler 22.03-LTS 基础配置

    文章目录 1 设置语言环境 1 1 显示当前语言环境状态 1 2 列出可用的语言环境 1 3 设置语言环境 2 设置键盘 2 1 显示当前设置 2 2 列出可用的键盘布局 2 3 设置键盘布局 3 设置日期和时间 3 1 使用timedat
  • 聚合工程是什么?与微服务有什么区别和联系?

    1 聚合的概念 把项目的各个模块 子工程 聚合在一起构建 一般用于分模块开发 最后整体打包发布 Maven Project独立运行 Maven Module无法独立运行 2 聚合工程开发步骤 1 根项目是一个pom项目 2 子模块 Mave
  • Eigen 简单矩阵运算

    用到 Eigen Core 和 Eigen Dense 模块 矩阵定义 Eigen Matrix lt 数据类型 行数 列数 gt 矩阵名称 已经提供的矩阵类型 Vector3d 向量名称 实质上是 Eigen Matrix
  • Python 中 import 的机制与实现

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

    1 导入Excel文件 data pd read excel D 下载 PlayTennis xlsx 2 查看数据维度 data7 data shape 3 查看数据类型 type data 4 索引 索引某一列 data1 data D
  • Linux之——添加VIP

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net l1028386804 article details 81347068 转载请注明出处 https blog csdn net l10283868
  • 使用VNA(Vector Network Analyzer)对S参数进行去嵌(二)

    使用VNA Vector Network Analyzer 对S参数进行去嵌 一 小孟boy的博客 CSDN博客 vna测s11公式 去嵌过程 无论是使用 EM 仿真工具创建的简化模型 如一段理想传输线 还是复杂模型用于测试夹具 现在都需要
  • Check failed: registry.count(type) == 1 (0 vs. 1) Unknown solver type: SGD (known types: )

    问题 在xcode下面编译调试caffe cpp时出现 Check failed registry count type 1 0 vs 1 Unknown solver type SGD known types 解决方法 在caffe cp
  • 4PCS、super4PCS粗配准算法理解

    参考了泡泡点云时空的文章4PCS点云粗配准算法介绍 一 4PCS系列的点云配准方法有点类似Ransac 通过找出目标点云和带配准点云中对应的两组点进行旋转平移求解出T 然后在众多的候选T中旋转一组最大重合的T 只是怎么找出对应点方法不一样
  • 关于深度学习中迭代次数iter和epoch等的关系

    1 在深度学习的训练中 epoch指的是所有的数据遍历了几次 而iter指的是整个batchsize输入到网络多少次 如果非得说关系 那 iter batchsize sum photos epoch
  • arch linux 安装教程(包括安装桌面环境,以及一些常用软件,输入法,网易云 等)

    2019 11 03添加 官方关于base组内所删除的包组情况 详细信息参照 wiki archlinux org 关于启动盘制作可以看 windows下安装grub2 可制作多功能U盘 和 grub2各种手动命令引导教程 这两篇文章 说明
  • java中执行js代码块_在Java中执行js代码

    Performance Monitor2 Peformance Counter Performance Counter 是量化系统状态或活动的一个数值 Windows Performance Monitor在一定时间间隔内 默认的取样间隔是
  • 使用timerfd实现定时器功能

    依旧以muduo为例 使用timerfd可以使用与socketfd类型相同的方式在IO复用中使用 使用timerfd create 创建一个timerfd 接着使用timerfd settime 设置定时器的到期时间 我们只需要注册time
  • 基于streamlit的表格展示-完美解决方案

    问题 用streamlit开发web app非常实用 但是streamlit的表格展示非常不友好 只有两个简单的接口函数 st table df 和st dataframe df 对于字段稍微比较多的dataframe显示效果相当不友好 s
  • linux安装中文、中文输入法以及火狐浏览器中文

    emm 今天突然想用下linux版本的web项目 发现进入浏览器后无法输入中文 鹅且也不知道中文输入法的入口 OTZ 摸索了一会 整理出来分享下 这里是分割线 啦啦啦啦 第一步 设置中文 话不多说直接看图 保存好 退出终端 重启系统 界面啥
  • 报错 LINK : fatal error LNK1181: 无法打开输入文件“cxcore.lib”

    转自 http www cnblogs com lxt287994374 archive 2012 11 23 2785274 html vs2010报错 1 gt LINK fatal error LNK1181 无法打开输入文件 cxc
  • C++头文件容器库——vector

    vector的使用 首先添加头文件 include