带你了解C++中vector的用法

目录
  • 一,什么是vector
  • 二,容器特性
    • 1,顺序序列
    • 2,动态数组
    • 3,能够感知内存分配器
  • 三,常用基本函数实现
  • 四,基本用法
    • 1,头文件
    • 2,创建和使用
    • 3,算法
  • 五,vector占用内存空间问题
    • 1,vector内存自增长
    • 2,vector内存释放
  • 六,疑问解答
    • 1,vector与数组的区别
    • 2,C++11关于vector的新增特性有:
  • 总结

一,什么是vector

vector(向量)是一个封装了动态大小数组的顺序容器。能够存放各种类型的对象(注:一个容器中所有对象必须是同一种类型的)。可认为vector是一个能够存放任意类型的动态数组,可添加和删除数据(因为动态,所以相比数组节省空间)。

c++ primer的作者说到,在实际的编程中,我们作为程序员应该避免用到低级数组和指针,而更应该多用高级的vector和迭代器。

二,容器特性

1,顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2,动态数组

支持对序列中的任意元素进行快速直接访问,可通过指针进行该操作。提供在序列末尾增加/删除元素的操作。

3,能够感知内存分配器

容器使用一个内存分配器对象来动态地处理它的存储需求。

三,常用基本函数实现

vector(): 构造函数,创建一个空vector

vector(int nSize): 创建一个vector,元素个数为nSize

vector(int nSize,const t& t): 创建一个vector,元素个数为nSize,且值均为t

vector(begin,end): 复制[begin,end)区间内另一个数组的元素到vector中

~vector(): 析构函数,销毁容器对象并回收所有分配内存

void push_back(const T& x): 向量尾部增加一个元素X

iterator insert(iterator it,const T& x): 向量中迭代器指向元素前增加一个元素x

iterator insert(iterator it,int n,const T& x): 向量中迭代器指向元素前增加n个相同的元素x

iterator insert(iterator it,const_iterator first,const_iterator last): 向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

iterator erase(iterator it): 删除向量中迭代器指向元素

iterator erase(iterator first,iterator last): 删除向量中[first,last)中元素

void pop_back(): 删除向量中最后一个元素

void clear(): 清空向量中所有元素,即size值全部为0,但存储空间没有改变(释放)

reference at(int pos): 返回pos位置元素的引用

reference front(): 返回首元素的引用

reference back(): 返回尾元素的引用

iterator begin(): 返回向量头指针,指向第一个元素

iterator end(): 返回向量尾指针,指向向量最后一个元素的下一个位置

bool empty() const: 判断向量是否为空,若为空,则向量中无元素

int size() const: 返回向量中元素的个数

int capacity() const: 返回当前向量所能容纳的最大元素值

int max_size() const: 返回最大可允许的vector元素数量值

void swap(vector&): 交换两个同类型向量的数据,交换两个容器内容,涉及存储空间分配问题

void assign(int n,const T& x): 设置向量中前n个元素的值为x

void assign(const_iterator first,const_iterator last): 向量中[first,last)中元素设置成当前向量元素

四,基本用法

1,头文件

vector是C++标准库STL中的数据结构,因此要使用vector,需要在程序头添加:

#include <vector>
using namespace std;

2,创建和使用

创建vector对象

//创建一个普通一维动态数组
vector<int> vec;
//创建一个二维动态数组
vector<vector<int>> vec2;
//尾部插入数字:
vec.push_back(1);
//尾部删除数字:
vec.pop_back();
//使用下标访问数组,下标从0开始
cout<<vec[0]<<endl;
//使用迭代器访问元素
vector<int>::iterator it;
for(it = vec.begin();it != vec.end();it++){
	cout<< *it <<endl;
}
//插入元素
vec.insert(vec.begin()+i,a);
//删除元素
vec.erase(vec.begin()+i);
vec.erase(vec.begin()+i,vec.end()+j);
//向量大小:
vec.size();
//清空向量:
vec.clear();

vector的元素可以是int,double,string,结构体,注意:结构体要定义为全局的,否则会出错。

3,算法

(1) 使用reverse将元素翻转:

// 需要头文件
#include <algorithm>
reverse(vec.begin(),vec.end());

(2)使用 sort 排序:

// 需要头文件
#include<algorithm>,
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

五,vector占用内存空间问题

1,vector内存自增长

与其他容器不同,其内存空间只会增长,不会减小。

为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。

因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。

每当vector容器不得不分配新的存储空间时,会以加倍当前容量的分配策略实现重新分配。

2,vector内存释放

所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素,但无法释放内存。如果需要空间动态缩小,可以考虑使用deque或者使用其他容器。

六,疑问解答

1,vector与数组的区别

相同点:

都是可以对同一种类型数据进行存储

都可以用迭代器操作

都可以通过下标进行数据处理

不同点:

vector动态长度,可通过push_back和pop_back方法增加和缩短长度;数组长度在定义时已经确定,不可更改

vector的下标必须是无符号数;数组下标可以是有符号数

2,C++11关于vector的新增特性有:

a.cbegin();    // 返回指向容器中第一个元素的const_iterator
a.cend();      // 返回指向容器中最后一个元素的const_iterator
a.crbegin();   // 反转迭代器, 返回指向容器中最后一个元素的const_iterator
a.crend();     // 反转迭代器, 返回指向容器中第一个元素的const_iterator
a.emplace();   // 类似insert功能,但比它更有效率
a.emplace_back(); //类似push_back, 但比它更有效率

总结

到此这篇关于带你了解C++中vector的用法的文章就介绍到这了,更多相关C++ vector用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-01-11

c++ 中vector 常见用法

目录 1.c++ 中 vector 2.初始化 3.常用函数 1.c++ 中 vector vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capacity,表示当前vector在内存中申请的这片区域所能容纳的元素个数. capacity会随着你的使用vector内置函数而动态变化. 通常capacity会比size大,如果往vector中push_back数据,这样就不用重新申请内存和拷贝元素到新内存区域了,便于节省时间. vector 之间可以之间赋值

C++中vector容器的注意事项总结

目录 容量(capacity)和大小(size)的区别 容器扩容的本质 emplace_back()和push_back()的区别 emplace()和insert()的区别 附:如果vector是空的,并且没有分配空间,切忌用下标进行访问,会出错!!! 总结 容量(capacity)和大小(size)的区别 vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数:而 vector 容器的大小(用 size 表示),指的是它实际所包含的

一篇文章让你轻松理解C++中vector和list区别

目录 一张表格让你理解vector和list区别 例子 总结 一张表格让你理解vector和list区别 区别 vector list 数据结构: 顺序表(动态数组) 环形双向链表 物理空间: 连续的 非连续的 内存消耗: 少 多 大小可变: 可变-动态数组 可变-通过指针 随机存储: 支持(vector 重载了[]) 不支持(因为非连续) 优势: 支持随机存储 任意节点高效的插入.删除等操作 劣势: 插入和删除进行内存拷贝工作 不支持随机存取 数据结构对比图: 那我们怎样选择使用vector和

C++入门之vector的底层实现详解

目录 前言 定义初始结构 声明构造函数 容量有关操作 获取有效数据大小size() 获取数据容量capacity() 增加容量reserve() 重置大小resize() 迭代器 数据操作 尾插push_back() 尾删pop_back() 某一位置插入 insert() 某一位置删除 erase() 拷贝构造 []访问操作 =赋值操作 特别注意!!! 总结 前言 上一小节,我们讲解了vector的使用,也大概了解了其创建对象,增删改查数据等操作.那么今天,我们就来大致实现一下吧. 定义初始结

C++入门之vector使用详解

目录 前言 创建对象 迭代器 数据插入 数据删除 容量操作 总结 前言 兜兜转转,我们来到了C++的vector章节,今天就讲讲怎么使用vector吧. vector的本质就是一个线性的顺序表,只不过在C++中被弄成了模板,以达到泛型编程目的.而使用的方面大概包括创建对象,数据插入,数据删除,数据访问,迭代器以及容量修改等方面 创建对象 在C++中,官方文档所给的创建对象方法有4-6种,博主这里便介绍其中最常用的4种,同时博主为了大家先能够简单使用,会省去一些与源文档不一样的地方. 直接创建,即

Python入门_条件控制(详解)

条件控制其实就是if...else...(如果...条件是成立的,就做...:反之,就做...)的使用,其基本结构是: 具体看下面这个例子: def account_login(): # 定义函数 password = input('请输入密码:') # 输入密码 if password == '12345': # 如果输入密码是12345,则登录成功 print('登录成功') else: print('密码有误,请重新输入') # 否则提示密码有误,请重新输入 account_login()

MySQL入门(二) 数据库数据类型详解

序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过今天的学习,已经解惑了.下面就跟着我的节奏去把这个拿下吧. ---WH 一.数据类型 MySQL的数据类型有大概可以分为5种,分别是 整数类型.浮点数类型和定点数类型.日期和时间类型.字符串类型.二进制类型.现在可以来看看你对这5种类型的熟悉程度,哪个看起来懵逼了,那就说明自己哪个不熟悉,不理解.

Java Vector类详解及实例代码

Java Vector类  Vector的特有功能 Vector出现较早,比集合更早出现 1:添加功能 public void addElement(Object obj);//用add()替代 2:获取功能 public Object elementAt(int index);//用get()替代 public Enumeration elements();//返回的是实现类的对象,用Iterator iterator() import java.util.Enumeration; impor

Docker快速入门以及环境配置详解

前言 数据科学开发环境配置起来让人头疼,会碰到包版本不一致.错误信息不熟悉和编译时间漫长等问题.这很容易让人垂头丧气,也使得迈入数据科学的这第一步十分艰难.而且这也是一个完全不常见的准入门槛. 还好,过去几年中出现了能够通过搭建孤立的环境来解决这个问题的技术.本文中我们就要介绍的这种技术名叫Docker.Docker能让开发者简单.快速地搭建数据科学开发环境,并支持使用例如Jupyter notebooks等工具进行数据探索. 简介 Docker 最初 dotCloud 公司内部的一个业余项目

Java vector的详解及实例

Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提高程序的质量.比如在c,c++中所谓的"动态数组"一般都由指针来实现.为了弥补这个缺点,Java提供了丰富的类库来方便编程者使用,vector类便是其中之一.事实上,灵活使用数组也可以完成向量类的功能,但向量类中提供大量的方法大大方便了用户的使用. 创建了一个向量类的对象后,可以往其中随意

C++ Vector用法详解

vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. 使用vector容器之前必须加上<vector>头文件:#include<vector>; vector属于std命名域的内容,因此需要通过命名限定:using std::vector;也可以直接使用全局的命名空间方式:using nam

c++中为什么不提倡使用vector示例详解

vector< bool> 并不是一个STL容器,不是一个STL容器,不是一个STL容器! 首先vector< bool> 并不是一个通常意义上的vector容器,这个源自于历史遗留问题. 早在C++98的时候,就有vector< bool>这个类型了,但是因为当时为了考虑到节省空间的想法,所以vector< bool>里面不是一个Byte一个Byte储存的,它是一个bit一个bit储存的! 因为C++没有直接去给一个bit来操作,所以用operator[]

PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解

本文实例讲述了PHP设计模式之中介者模式(Mediator Pattern).分享给大家供大家参考,具体如下: 咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,这种模式又称为调停者模式,它是一种对象行为型模式. 我们先来看用户与用户直接聊天的设计方案. 在这个方案设计的过程中,我们可以发挥想象,用户对象之间存在很强的关联性,将导致系统出现如下问题

PHP设计模式之策略模式(Strategy)入门与应用案例详解

本文实例讲述了PHP设计模式之策略模式(Strategy)入门与应用.分享给大家供大家参考,具体如下: 这个策略模式,意思就是定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,使用得算法的变化可独立于使用它的客户,简单来讲就是,策略模式设计帮助构建的对象不必自身包含逻辑,而是能够根据需要利用其他对象中的算法. 来看下应用场景: 1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. 2. 需要在不同情况下使用不同的策略(算法),或者策略还可能

PHP设计模式之观察者模式入门与应用案例详解

本文实例讲述了PHP设计模式之观察者模式.分享给大家供大家参考,具体如下: "观察者模式"的观察者三个字信息量很大,玩过很多网络游戏的童鞋们应该知道,即便是斗地主,除了玩家,还有一个角色叫"观察者",在咱们本次文章中的观察者模式也是如此,就是我们会有要有一个"主题",只有有了一个主题,观察者或者说各位看官才能搬着小板凳儿聚在一堆,来看我的文章.其次,观察者还必须要有自己的操作,也就是说,你不能光看我的文章啊,还得自己动手,否则你聚在一堆儿没事做也