STL容器之Vector

1.1 vector 概述

    vector的数据安排以及操作方式,与array相似。两者之间的唯一区别在于空间运用的灵活性
    vector是动态空间,也就是动态数组
    array是静态空间,一旦存储空间确定就不能改变

vector的特点:
    与array相比,内存的分配更加灵活。
    与list相比,在随机存取方面特别高效,但是在插入删除方面显得比较无力。

1.2 vector定义摘要

知其然,更要知其所以然,下面是SGI STL对于vector的定义摘要, 对于只是希望能够使用vector容器的小伙伴们可以直接略过这一节。
在使用vector容器的时候,我们需要包含头文件,但是在SGI STL中对于vector的定义却在

// alloc是SGI STL的空间适配器,说白了就是内存分配管理的类
template<class T,class Alloc=alloc>
class vector{
public:
//vector的嵌套类型定义
    typedef T       value_typ;
    typedef value_type*  pointer;
    typedef value_type*  iterator;
    typedef value_type&  reference;
    typedef size_t       size_type;
    typedef ptrdiff_t    difference_type;

protected:
    //下面一行,simple_alloc是SGI STL的空间适配器
    typedef simple)alloc<value_type,Alloc> data_allocator;

    //vector当中的迭代器
    iterator start;            //指向vector头部的迭代器
    iterator finish;           //指向vector所存数据的尾部
    iterator end_of_storage;   //指向所有可用vector尾部

    void insert_aux(iterator position, const T& value);//insert函数底层调用的插入函数
    void deallocate(){
        if(start)
          data_allocator::deallocator(start, end_of_storage-start);
    }
    void fill_initialize(size_type n,const T& value){
        start = allocate_end_fill(n,value);
        finish = start + n;
        end_of_storage = finish;
    }
public:
//下面是常用的操作vector当中元素的函数定义
    iterator begin(){ return start; }
    iterator end(){ return finish;}
    size_type size() const { return size_type(end()-begin());}
    size_type capacity() const { return size_type(end_of_storage-begin());}
    bool empty() const { return begin() == end();}
    reference operator[](size_type n){return *(begin()+n);}
    //构造函数
    vector():start(0),finish(0),end_of_storage(0){}
    vector(size_type n,const T& value){fill_initialize(n,value);}
    vector(long n,const T& value){fill_initialize(n,value);}
    vector(int n,const T& value){fill_initialize(n,value);}
    explict vector(size_type n){fill_initialize(n,T());}

//析构函数
    ~vector(){
        destory(start,finish);//全局函数
        deallocate();//vector的一个member function
    }

    reference front(){return *begin();}//获取第一个元素
    reference back(){return *(end()-1);}//获取最后一个元素
    //vector 尾部插入元素
    void push_back(const T& x){
        if(finish!=end_of_storage){
            construct(finish,x);//全局函数
            ++finish;
        }
        else
            insert_aux(end(),x);
    }

    //vector尾部弹出元素
    void pop_back(){
        --finish;
        destroy(finish);
    }

    iterator erase(iterator position){
    //删除某个位置上的元素
        if(position + 1!=end())
            copy(position+1,finish,position);//把后续元素往前移动
        --finish;
        destory(finish);
        return position;
    }
    void resize(type_size new_size, const T& x){
        if(new_size<size())
            erase(begin()+new_size,end());
        else
            insert(end(),new_size-size(),x);
    }
    void resize(size_type new_size){resize(new_size,T());}
    void clear(){erase(begin(),end());}

protected:
    //配置空间并填满内容
    iterator allocate_and_fill(size_type n,const T& x){
        iterator result = data_allocator::allocate(n);
        uninitialized_fill_n(result,n,x);//全局函数
        return result;
    }
}
//vector的定义当中,如果仅仅是使用vector容器,有些函数可以不去详细了解,但是如果你想了解STL的设计思路和设计结构,这些源码还是很值得细细品味的。

1.3测试vector容器

一个优秀的程序员一定是大量的代码培养起来的,当然我肯定不能算优秀,但是我正在朝着大神的方向努力着,一起来吧,让我们熟练的使用vector,源码是精髓,我们可以去了解,但是我们最重要的目的当然是来使用STL,使用vector容器。

一个vector的测试demo:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> vec;//模板的第二个参数可以省略,这样调用vector()构造函数
    cout << vec.capacity() << endl;//查看vector分配的空间大小
    cout << "==================" << endl;
    vec.push_back(3);
    vec.push_back(8);
    vec.push_back(10);
    vector<int>::iterator it;
    for (it = vec.begin(); it != vec.end(); it++)
        cout << *it << endl;
    cout << "==================" << endl;
    vec.pop_back();

    for (it = vec.begin(); it != vec.end(); it++)
        cout << *it << endl;

    cout << "====================" << endl;

    vec.insert(vec.begin() + 1, 15);

    for (int i = 0; i < vec.size(); i++)
        cout << vec[i] << endl;
    cout << "+++++++++++++++++++++++++" << endl;
    cout << vec.front() << endl;
    cout<<vec.back()<<endl;
    cin.get();
    return 0;
}

总结:
学会了vector的基本使用,尝试着看了,vector的源码,才发现自己所学之知识是多麽的浅显。以上是我对vector动态数组容器的基本认识,为了避免重复造轮子带来时间的浪费,有必要掌握STL,当然如果你是大神,你也可以自己去实现这些功能。点滴的记录,是为了更好的记忆和复习。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值