STL容器: vector数组

STL容器: vector数组

前言

1.容器的概观和分类

任何特定的数据结构都是为了实现某种特定的算法,STL容器将运用最广的一些数据结构实现出来。

常用的数据结构包括array、list、tree、stack、queue、hash table、set、map.…等

根据数据在容器中的排列特性,将数据结构分为序列式关联式两种:

  • 序列式容器包括:array、vector、heap、list、deque、stack、queue等
  • 关联式容器包括:RB-tree、set、map等

2.vector

2.1 vector概述

vector的数据安排及操作方式和array很像,但array是静态空间,vector是动态空间。

2.2 vector的数据结构

vector所采用的数据结构是线性连续空间。

它以两个迭代器(也可理解为指针)start和finish指向已经使用部分的头和尾;

end_of_storage指向整块空间的尾端。

template <class _Ty, class _Alloc = allocator<_Ty>>
class vector{
    ...
protected:
    pointer start;
    pointer finish;
    pointer end_of_storage;
};

运用迭代器实现功能:

class vector{
    ...
public:
    //得到数组头的指针
    iterator begin() {return start;}
    //得到数组的最后一个单元+1的指针
    iterator end() {return finish;}
    //当前使用数据的大小
    size_type size() const {return size_type(end() - begin());}
    //当前vector分配的大小,区分于size
    size_type capacity() const {return size_type(end_of_storage() - begin());}
    //判断vector是否为空
    bool empty() const {return begin() == end()}
    //得到数组头的引用
    reference front() {return *begin;}
    //得到数组的最后一个单元的引用
    reference back() {return *(end() - 1);}
};

2.3 vector数组的初始化

一维数组

vector <int> v; //默认初始化
vector <int> v = {1,2,3,4,5};
vector <int> v(7); //v中将包含7个元素
vector <int> v(2,3); //v中将包含两个值为3的int
//拷贝初始化
vector <int> v(v1); OR vector <int> v = v1;

二维数组

vector <vector <int>> v;
vector <vector <int>> v(n, v0);

求二维数组的行列数:

vector<vector<int>> matrix//这是一个矩阵int 
rows = matrix.size();//求得行数
col = matrix[0].size();//求的列数

2.4 vector的构造与内存管理:push_back

vector提供许多constructors,其中一个允许我们指定空间大小及初值:

 //构造函数,允许指定vector大小初值n和初值value
 vector(size_type n,const T& value)
{
 	fill_initialize(n,value);
}
void fill_initialize(size_type n, const T& value){
	start = allocate_and_fill(n,value);
    finish = start + n;
    end_of_storage = finish;
}

push_back : 在数组最后添加一个元素

void push_back(const T& x)
{
	if(finish != end_of_storage){
        ++finish;
    }    
    else
        insert_aux(emd(),x); //插入函数的基础
}

所谓动态增加大小,并不是在原空间之后接续新空间,而是以原大小两倍另外配置一块较大空间,将原内容拷贝过来,释放原空间。

因此,对vector的操作一旦引起空间重新配置,指向原vector的迭代器就全部失效了。

emplace_back()和push_back()的区别:

功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素

emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同

push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);

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

2.5 vector的元素操作:pop_back, erase, clear, insert

//去掉数组的最后一个数据 
void pop_back(){
	--finish; 
	destory(finish);
    //将尾端标记向前移动一格,放弃尾端元素
}

//清除(firat,last)中的所有元素
iterator erase(iterator first, iterator last);

//清除某个位置上的元素
iterator erase(iterator position);

//清除所有元素
void clear(); { erase(begin(),end());}

//在x的position前插入n
insert(iterator position, size_type n,const T& x);

参考来源:STL源码剖析

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值