(STL) vector的简单用法和实现

原创 2017年12月17日 22:36:03

vector:能够操作多种数据结构和算法的模板类和函数库的C++标准模板库;是一个容器可以存放任意类型的对象,所以可以看作是一个能够存放任意类型的动态数组或顺序表。

STL里的vector是由三个指针来维护的:_start(数据存放开始的位置),_finish(数据存放结束位置的下一个),_endofstorage(容量的最后一个位置)。

这里写图片描述

Vector的简单使用:

^使用vector需要加上头文件#include<vector>
^vector属于std命名域,前面需写上using namespace std;
^vector<int> vec(n);像数组一样可以存放n个int型数据;
^ vec[i]=2;像数组一样访问修改数据;
^可以装入自定义的数据类型

struct AA{ };
vector<AA> vec;

^定义容器的时候可以进行初始化,并可以给其他容器对象赋值

vector<int> vec1(15,0);//容纳15个int类型的数据,初值为0;
vector<int> vec2;
vec2=vec1;

^对于容器,使用迭代器操作容器中对应位置的值,当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了.

Vector函数实现功能:
vector vec;
vec.clear() 移除容器中所有数据。
vec.empty() 判断容器是否为空。
vec.erase(pos) 删除pos位置的数据
vec.insert(pos,elem) 在pos位置插入一个elem拷贝
vec.pop_back() 删除最后一个数据。
vec.push_back(elem) 在尾部加入一个数据。
vec.resize(num) 重新设置该容器的大小
vec.size() 回容器中实际数据的个数。
vec.begin() 返回指向容器第一个元素的迭代器
vec.end() 返回指向容器最后一个元素的迭代器

Vector的简单实现:

#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;

template<class T>
class Vector
{
public:
    typedef T* Iterator;
    typedef const T* ConstIterator;
    Vector()
        :_start(NULL)
        , _finish(NULL)
        , _endofstorage(NULL)
    {}
    Iterator Begin()
    {
        return _start;//第一个元素的位置
    }
    Iterator End()
    {
        return _finish;//最后一个元素的下一个位置
    }
    size_t Size()
    {
        return _finish - _start;
    }
    size_t Capacity()
    {
        return _endofstorage - _start;
    }

    void PushBack(const T& x)
    {
        Iterator end = End();
        Insert(end, x);
    }
    void PopBack()
    {
        assert(Size() > 0);
        Erase(End());
    }
    void Insert(Iterator pos, const T& x)
    {
        size_t n = pos - _start;
        //插入前应该先检查容量
        if (_finish == _endofstorage)
        {
            size_t len = Size() == 0 ? 2 : 2 * Capacity();
            Expand(len);
        }
        pos = _start + n;
        //把pos位置之后的数据往后挪
        for (Iterator end = End(); end != pos; --end)
        {
            *(end) = *(end - 1);
        }
        *pos = x;
        ++_finish;
    }
    void Erase(Iterator pos)
    {
        //防御式编程,先要判断所给位置是否合法
        assert(pos != NULL);
        //把pos之后的数据往前挪
        for (Iterator end = pos; end < End(); ++end)
        {
            _start[end - _start] = _start[(end + 1) - _start];
        }
        --_finish;
    }
    void Expand(size_t n)
    {
        size_t size = Size();
        size_t capacity = Capacity();
        //当需要的空间大于容量的时候,扩容并拷贝内容
        if (n > capacity)
        {
            //vector是一个可以存放任意类型的动态数组,所以这里在扩容的时候开辟的是数组
            T* ret = new T[n];
            for (size_t i = 0; i < Size(); ++i)
            {
                ret[i] = _start[i];
            }
            delete[] _start;
            //改变数组的指向和容量大小
            _start = ret;
            _finish = _start + size;
            _endofstorage = _start + n;
        }
    }
    void Resize(const size_t n, const T& val = T())
    {
        //当要扩充的容量小于数组的元素个数时,只改变_finish的位置,不改变_capacity的位置
        if (n < Size())
        {
            _finish=_start - n;
        }
        //当要扩充的容量大于数组的元素个数时,增容之后,没有数据的位要进行初始化
        else
        {
            Expand(n);
            size_t size = n - Size();
            for (size_t i = 0; i < size; ++i)
            {
                PushBack(val);
            }
        }
    }
    void Reverse(const size_t n)
    {
        //只扩容然后进行依次赋值,不进行初始化
        Expand(n);
    }
    T& operator[](size_t pos)
    {
        assert(pos < Size());
        return _start[pos];
    }
    const T& operator[](size_t pos)const
    {
        assert(pos < Size());
        return _start[pos];
    }
    void Print()
    {
        for (size_t i = 0; i < Size(); ++i)
        {
            cout << _start[i] << " ";
        }
        cout << endl;
    }
protected:
    Iterator _start;//数组的首元素
    Iterator _finish;//数组的元素个数
    Iterator _endofstorage;//数组的容量
};


int main()
{
    Vector<int> p;
    p.PushBack(1);
    p.PushBack(2);
    p.PushBack(3);
    p.PushBack(4);
    p.PushBack(5);
    p.PushBack(6);
    Vector<int>::Iterator pos=p.Begin();
    for (; pos != p.End();)
    {
        cout << *pos << " ";
        ++pos;
    }
    cout << endl;
    p.PopBack();
    p.PopBack();
    Vector<int>::Iterator it=p.Begin();
    p.Erase(it);
    p.Resize(7,0);
    p.Reverse(6);
    p.Print();
    system("pause");
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39295755/article/details/78826159

STL vector的内部实现原理及基本用法

本文基于STL vector源代码,但是不考虑分配器allocator,迭代器iterator,异常处理try/catch等内容,同时对_Ucopy()、 _Umove()、 _Ufill()函数也不...
  • u012658346
  • u012658346
  • 2016-02-23 20:38:46
  • 10962

STL——STL中vector的实现原理

STL中vector的实现原理
  • Linux_ever
  • Linux_ever
  • 2016-03-24 21:33:45
  • 2868

《<em>STL</em>系列》之<em>vector</em>原理及<em>实现</em>

被举报人: laoou123456laoou 举报的资源分: 3 *类型: *详细原因: 取  消 提  交 《<em>STL</em>系列》之<em>vector</em>原理及<em>实现</em> 3积分 立即下载 ...
  • 2018年04月13日 00:00

STL-vector的实现

STL——vector的实现
  • Sad_Sugar
  • Sad_Sugar
  • 2016-02-17 20:27:30
  • 474

STL vector中的at方法(20)

public member function std::vector::at reference at (size_type n); const_reference a...
  • guang_jing
  • guang_jing
  • 2014-08-16 01:04:00
  • 2490

STL 简单 vector 的实现

我是照着侯捷老师的《STL源码剖析》做的cghSTL,现在才看到第三章,忽然觉得这本书的编排非常适合自学。 第一章讲解空间配置器,这是STL最基础的部件,没什么好说的。 第二章讲解迭代器,老师举了单向...
  • chengonghao
  • chengonghao
  • 2016-05-15 21:59:14
  • 2055

C++ vector STL实现详解

前言 stl库位置 vector代码分析 vector变量gdb输出总结0.前言  早前使用gdb调试特别不习惯,1)没有具备图形界面IDE(比如Visual Studio)的强大功能:边打断点边代码...
  • matrix_zzl
  • matrix_zzl
  • 2017-11-19 21:25:38
  • 112

STL源码:vector

vector与array的相同与不同: 相同:           vector的数据安排以及操作方式与array很相似。 不同:          两者的差别主要是在空间运用的灵活上。      ...
  • u013074465
  • u013074465
  • 2015-03-19 15:22:21
  • 1786

STL<vector>用法汇总

使用场合: vector算是一个比较万金油的容器,它是一个可变大小数组,支持随机访问,不过在尾部以外的位置进行增加和删除操作会比较耗时。通常用vector来代替原始的数组来使用,比较方便。 ...
  • weixin_35929051
  • weixin_35929051
  • 2016-09-25 13:16:57
  • 2013

使用STL中的vector构建图的方法

首先定义edge,有三个元素:去向的边,距离,和花费金钱等。 然后vectorG[N]定义图 是一个吊桶形状的数据结构 例如输入: 3 2 1 2 5 6 2 3 4 5 1--...
  • wxyfennie
  • wxyfennie
  • 2016-06-09 13:50:41
  • 1487
收藏助手
不良信息举报
您举报文章:(STL) vector的简单用法和实现
举报原因:
原因补充:

(最多只允许输入30个字)