关闭

表(Vector)的实现——算数学习(一)

148人阅读 评论(0) 收藏 举报

一不小心又在语法的深渊里挣扎了两天,终于爬出来了,心累,下面开始正题。

表是一种最初级的数据结构,它除了头和尾的每一个元素都有一个直接的前驱和后继,它允许的操作包括:指定元素访问、插入、删除,指定位置的的访问、插入删除。

它有两种实现方式,数组实现和链表实现。

数组实现,也就是STL库中的vector,也叫向量。链表实现,就是STL库中的list。我已将把它们的阉割版实现了一遍。这里先分析一下Vector的实现。

Vector

目标:

  1. 多种构造方式
  2. 动态分配空间
  3. 头插和尾插
  4. 重载索引
  5. 迭代器

要点:

  1. protected:
        int theSize;
        int theCapacity;
        Object* objects;
    Vector一共有三个最基本的私有成员:theSize,Vector中已存入元素数目;theCapacity,Vector的容量;Object,Vector中用来装元素的数组
  2.     explicit Vector(int initSize = 0): theSize{initSize}, theCapacity{initSize + SPARE_CAPACITY}
        {
            objects = new Object[theCapacity];
        }
    这是Vector的构造函数,也是无参的构造函数。可以清楚地看出Vector的核心就是一个数组。默认传入0,也就是说无参的时候,构造出的Vector为空。注意:这里传入参数不是用来初始化Vector的元素的,而是表示构造好的Vector,一出生就有intSize个元素,而这些元素是随机的。需要手动初始化。
  3.     void push_back(const Object& x)
        {
            if(theSize == theCapacity)
                reserve(2 * theCapacity + 1);
            objects[theSize++] = x;
        }
    这是尾插的方法,Vector和数组最大的不同就是它可以,动态的分配空间,不用只使用定义时那么大的空间。从尾插的方法就可以看出,当Vector没有可用空间也就是存储元素数目==可用空间时,便会自动重新分配存储空间,也就是原来的两倍。
  4.     void reserve(int newCapacity)
        {
            if(newCapacity < theSize)
                return;
    
            Object* newArray = new Object[newCapacity];
            for(int k = 0; k < theSize; ++k)
                newArray[k] = std::move(objects[k]);
    
            theCapacity = newCapacity;
            std::swap(objects, newArray);
            delete[] newArray;
        }
    这是尾插时动态分配时调用的方法。接受一个参数,作为新的容量。 这是用来扩大容量的,当然新容量要比旧容量大。然后用新容量构造一个新数组。(这个move我看不懂......)然后把旧数组的元素拷贝到新数组中去,然后用swap交换两个数组的位置,这样Object指向的位置就不用变啦。把旧数组(现在在新数组的位置,因为他俩换位置了)删除就好了。
  5.     typedef Object* iterator;
        typedef const Object* const_iterator;
    迭代器类型使用指针实现的,数组的0索引位置的指针就是头迭代器,数组theSize-1索引位置的指针就是尾迭代器。这样的实现方法很简单,但也会造成一个问题,就是我如果插入一个元素,便会使它之后的元素的迭代器失效(指的不是我想让他指的元素了),如果插入后动态分配空间了,那么一个迭代器也用不了了。
Vector 到此就算是分析完了,肯定会有错误,欢迎指教。
0
0
查看评论

【邻接表】STL中的vector实现邻接表

/* STL中的vector实现邻接表 2014-4-2 08:28:45 */ #include #include #include #define MAX 10000 using namespace std; struct EdgeNode{ //边表节点类型 int to, w...
  • u012846486
  • u012846486
  • 2014-04-02 10:14
  • 2586

表(List)的实现——算数学习(二)

终于考完试到家啦,更新开始 上一次实现了Vector,这一次实现List。 List是链表,它有O(1)复杂度的出入删除效率。但是同时它的查找效率却变成了O(n)的复杂度。 有利有弊,这才正常,下面那我们开始实现。 List 目标: 链表结构、结点结构的实现迭代器的实现多种构造方法多种操作 要点...
  • hjkajh
  • hjkajh
  • 2017-01-17 11:42
  • 67

用vector实现邻接表的建图

一、vector 简介及基本操作: 1、vector是c++中stl库中封装好的容器,常用定义不定长数组来构建无向图或有向图. 2、基本操作: (1)头文件#include. (2)创建vector对象,vector vec; (3)尾部插入数字:vec.push_back(a); (4)使用...
  • bokzmm
  • bokzmm
  • 2016-04-18 19:42
  • 1968

C/C++ 算数表达式计算

其实如果要理清编译原理之类的东西,第一步就是要搞词法分析,有了词法分析,就可以再做语法分析,我文讨论简单的词法分析的一个小例子—算数表达式,这个是我一个网友问到我的问题,虽然脑子里有个大概的思路,要么使用栈模型,要么使用二叉树模型,但思路不是很清晰,花了一些时间来整理了一下思路并形成了代码。思路如下...
  • what951006
  • what951006
  • 2017-09-08 11:27
  • 424

STL 简单 vector 的实现

我是照着侯捷老师的《STL源码剖析》做的cghSTL,现在才看到第三章,忽然觉得这本书的编排非常适合自学。 第一章讲解空间配置器,这是STL最基础的部件,没什么好说的。 第二章讲解迭代器,老师举了单向链表的例子,这非常有考究,单向链表不需要连续的存储空间,意味着使用单向链表实现的容器不需要考虑空间溢...
  • chengonghao
  • chengonghao
  • 2016-05-15 21:59
  • 1838

STL ——vector 学习

STL简介   C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.  C++ STL 提供给程序...
  • u011721440
  • u011721440
  • 2014-08-12 21:10
  • 744

【STL】 vector 模拟实现

上一篇博客说了一下list的使用,其实vector用法基本上和list是一样的,所以此篇博客就只模拟实现以下vector。vector你可以把它理解成一个顺序表或者数组。只是STL里的vector是由三个迭代器来维护的:_start(数据存放开始的位置),_finish(数据存放结束位置的下一个),...
  • pointer_y
  • pointer_y
  • 2016-09-23 19:55
  • 699

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

本文基于STL vector源代码,但是不考虑分配器allocator,迭代器iterator,异常处理try/catch等内容,同时对_Ucopy()、 _Umove()、 _Ufill()函数也不会过度分析。一、vector的定义template<class _Ty, class ...
  • u012658346
  • u012658346
  • 2016-02-23 20:38
  • 8556

STL——STL中vector的实现原理

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

集合类----Vector与Enumeration接口

Vector是java.util包的类,功能是实现了一个动态增长的数组,并为每个包含的元素分配一下整数索引号,这样就可以根据索引号删除、插入一个元素,也可以修改、获得一个元素的值。既然是动态数组,也可以在应用中来调整、裁减数组的长度。Vector的方法都是同步的(Synchronized), 是线程...
  • dych3r
  • dych3r
  • 2011-11-17 22:22
  • 2092
    个人资料
    • 访问:676次
    • 积分:57
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档