C++ STL之Vector介绍

0.前言

在讲解vector之前,先简单的介绍下STL。

C++ STL是(Standard Template Library标准模板库)是通用类模板和算法的结合,它提供给程序员一些标准的数据结构的实现如queue(队列),list(链表),和stacks(栈)等。

C++ STL提供了三类数据结构的实现:

(1)顺序容器

vector 从后面快读的插入和删除,直接访问任何元素

deque 从前面或后面快速的插入和删除,直接访问任何元素

list   双链表,从任何地方快递的插入与删除

(2)关联容器

set  快速查找,不允许重复值

multiset 快速查找,允许重复值

map  一对多映射,基于关键字快速查找,不允许重复值

multimap  一对多映射,基于关键字快速查找,允许重复值

(3)容器适配器

stack  后进先出

queue 先进先出

priority_queue  最高优先级元素总是第一个出列

 

1、C++ Vector(向量容器)

       是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector看作动态数组。

       在创建一个vector后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始空间的大小可以预先指定也可以由vector默认指定,这个大小即capacity()函数的返回值。当存储的数据超过分配的空间时,vector会重新分配一块内存,但这样的分配是很耗时的,在重新分配的内存空间时它会做如下的动作:

首先,vector会申请一块更大的内存块;

然后,将原来的数据拷贝到新的内存块中;

其次,销毁掉原内存块中的对象(调用对象的析构函数);

最后,将原来的内存空间释放掉。

如果vector保存的数据量很大时,这样的操作一定会导致槽糕的性能(这也是vector被设计成比较容易拷贝的值类型的原因)。所以说,vector不是在什么情况下性能都好,只有预先知道它大小的情况下vector的性能才是最优的。

2、vector的特点:

(1)指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() 和pop_back()。

(2)随机访问方便,它像数组一样被访问,即支持[ ]操作符和vector.at()。

(3)节省空间,因为它是连续存储,在存储数据的区域都没有被浪费的,但是要明确一点vector大多数情况下都是为存满的,在未存储的区域实际是浪费的。

(4)在内部进行插入、删除效率非常低,这样的操作基本上是被禁止的。vector被设计成只能在尾部进行追加和删除操作,其原因是vector内部的实现是按照顺序表的原理。

(5)只能在vector的最后进行push和pop,不能在vector的头部进行push和pop。

Vector包含着一系列连续存储的元素,其行为和数组类似。访问vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所在的位置或是在vector中插入元素则是线性时间复杂度。

3、vector的成员函数:

(1)Constructors构造函数

vector<int> v1;  //构造一个空的vector
vector<int> v2(5, 42);  //构造了一个包含5个值为42的元素的vector

(2)Operators 对vector进行赋值或比较

         C++ Vector能够使用标准运算符:==,!=,<=,>=,< 和 >

        要访问vector中的某特定位置的元素可以使用 [] 操作符

        两个vector被认为是相等的,如果:

        1、他们具有相同的容量

       2、所有相同位置的元素相等

(3)assign()对vector中的元素进行赋值

void assign(input_iterator start, input_iterator end);
//将区间[start, end)的元素赋值到当前vector

void assign(size_type num, const TYPE &val);
//赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容

(4)at() 返回指定位置的元素

(5)back() 返回最末一个元素

(6)begin() 返回第一个元素的迭代器

(7)capacity() 返回vector()所能容纳的元素数量(在不重新分配内存的情况下)

(8)clear() 清空所以元素

(9)empty() 判断vector是否为空(返回true时为空)

(10)end() 返回最末元素的迭代器(实指向最末元素的下一个位置)

(11)erase() 删除指定元素

iterator erase(iterator loc);  //删除loc处的元素
iterator erase(iterator start, iterator end);  //删除start和end之间的元素

(12)front() 返回第一个元素的引用

(13)get_allocator() 返回vector的内存分配器

(14)insert() 插入元素到vector中

iterator insert(iterator loc, const TYPE &val);
//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
void insert(iterator loc, size_type num, const TYPE &val);
//在指定位置loc前插入num个值为val的元素
void insert(iterator loc, input_iterator start, input_iterator end);
//在指定位置loc前插入区间[start, end)的所有元素

(15)max_size() 返回vector所能容纳元素的最大数量(上限)

(16)pop_back() 移除最后一个元素

(17)push_back() 在vector最后添加一个元素

(18)rbegin() 返回vector尾部的逆迭代器

(19)rend() 返回vector起始的逆迭代器

(20)reserve() 设置vector最小的元素容纳数量

(21)resize() 改变vector元素数量的大小

语法:void resize(size_type size, TYPE val);//改变当前vector的大小为size,且对新创建的的元素赋值

(22)size()返回vector元素数量的大小

(23)swap() 交换两个vector

语法:void swap(vector &from);

解释:

capacity():指的是在不重新分配内存下,当前已经分配的可以容纳的元素的个数。

size():指的是当前元素个数(即当前的vector已经存了多少个元素的数量)。

max_size():指的是vector最大的可能的元素保存个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orgotF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值