(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");
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

STL中vector、list、deque的区别

1 vector     向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即...
  • luliyuan
  • luliyuan
  • 2014年04月02日 11:12
  • 2092

C++ STL内部简单细节整理

对于使用C++语言进行项目开发的同学,STL必然是必须掌握并且熟练的技术。除了能够熟练使用,我们当然也有必要知道其内部实现原理。当然,对于新手或者并属于一线开发者的同学,一下子看懂STL源码是不现实的...
  • njustzj001
  • njustzj001
  • 2015年06月28日 21:04
  • 1503

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

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

C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2 ...
  • Al_xin
  • Al_xin
  • 2014年09月11日 08:08
  • 884

STL之:简单的vector实现

转自: 前言 《Cracking the coding interview》是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book。...
  • u012564690
  • u012564690
  • 2014年05月16日 21:33
  • 1197

从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2 template class _...
  • Simba888888
  • Simba888888
  • 2013年07月23日 18:23
  • 4767

简单粗暴-说说STL中vector的实现原理

vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。 array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自...
  • hxqneuq2012
  • hxqneuq2012
  • 2016年03月05日 11:07
  • 317

【STL C++】简单实现vector

/*     fileName:       向量Vector的实现 date:           2015.9.14 finalDate:      2015.9.19 author:    ...
  • u013586251
  • u013586251
  • 2015年09月19日 15:13
  • 153

STL 简单 vector 的实现

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

c++ stl库 vector简单的实现

//stl库中vector是一个自动管理的动态数组; //其实只要明白vector的类型是一个数组,怎么去实现它,其实就好办了;   //我选择了一种简单的方式去实现它;//定义一个步长(WAL...
  • tanyancc
  • tanyancc
  • 2012年03月31日 18:39
  • 637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(STL) vector的简单用法和实现
举报原因:
原因补充:

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