关闭

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

114人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:429次
    • 积分:55
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档