普通版本的顺序表

什么是Vector?
vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。

vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。

#include<iostream>
#include<assert.h>
#include <algorithm>
using namespace std;
typedef int DateType;
class SeqList
{
public:
    SeqList()
        :_array(new DateType[3])
        , _size(0)
        , _capacity(3)
    {}
    SeqList(const DateType& data, int size)//构造函数
        :_array(new DateType[size])
        , _size(size)
        , _capacity(size)
    {
        for (int i = 0; i < size; i++)
        {
            _array[i] = data;
        }
    }
    SeqList(const SeqList&s)//拷贝构造函数
        :_array(new DateType[s._size])
    {
        for (int i = 0; i < s._size; i++)
        {
            _array[i] = s._array[i];
        }
    }
    SeqList&operator=(const SeqList&s)//赋值运算符重载
    {
        if (this != &s)
        {
            DateType*temp = new DateType[s._size];
            delete[]_array;
            for (int i = 0; i < s._size; i++)
            {
                temp[i] = s._array[i];
            }
            _array = temp;
            _size = s._size;
            _capacity = s._capacity;
        }
        return *this;
    }
    ~SeqList()
    {
        if (_array)
        {
            delete[]_array;
            _array = NULL;
        }
    }
    void PushBack(DateType data);//尾插
    void PopBack();//尾删
    void PushFront(DateType data);//头插
    void PopFront();//头删
    void Insert(int pos, DateType data);//任意位置插入
    void Erase(int pos);//任意位置删除
    size_t Size()const;
    friend ostream&operator<<(ostream&_cout, SeqList&s);
    int capacity();
    DateType&operator[](int index);//数组索引
     //返回顺序表中的第一个元素 
    DateType& Front();
    const DateType& Front()const;
     //返回顺序表中最后一个元素 
    DateType& Back();
    const DateType& Back()const;
    void reserve();//逆置
    void resize(int newsize, const DateType&data);////将_size 到 size之间的元素赋值为data
    void resize(int newsize);//resize的重载函数
    DateType At(size_t index);//输出下标为index的值
    bool empty()const;//判断顺序表是否为空
    void clear();//清空
    void Assign(size_t n, const DateType& data);//赋n个值为data的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.
    void Assign(size_t n);
private:
    void Capacity()
    {
        if (_size == _capacity)
        {
            DateType*temp = new DateType[2*_capacity];
            for (int i = 0; i < _size; i++)
            {
                temp[i] = _array[i];
            }
            delete[]_array;
            _array = temp;
            _capacity = 2 * _capacity;
        }
    }
    DateType *_array;
    int _size;
    int _capacity;
};
void SeqList::PushBack(DateType data)
{
    Capacity();
    _array[_size++] = data;
}
void  SeqList::PopBack()
{
    if (_array)
    {
        _array[_size--];
    }
}
void SeqList::PushFront(DateType data)
{
    Capacity();
    for (int i = _size; i > 0; i--)
    {
        _array[i] = _array[i - 1];
    }
    _array[0] = data;
    _size++;
}
void SeqList::PopFront()
{
    for (int i = 0; i < _size; i++)
    {
        _array[i] = _array[i + 1];
    }
    _size--;
}
void SeqList::Insert(int pos, DateType data)//任意位置插入
{
    assert(pos <= _size);
    Capacity();
    for (int i = _size; i > pos; i--)
    {
        _array[i] = _array[i - 1];
    }
    _array[pos] = data;
    _size++;
}
void SeqList::Erase(int pos)//任意位置删除
{
    assert(pos < _size);
    for (int i = pos; i < _size - 1; i++)
    {
        _array[i] = _array[i + 1];
    }
    _size--;
}
size_t SeqList::Size()const
{
    return _size;
}
ostream&operator<<(ostream&_cout, SeqList&s)
{
    for (int i = 0; i < s._size; i++)
    {
        _cout << s._array[i] << " ";
    }
    cout << endl;
    return _cout;
}
int SeqList::capacity()
{
    return _capacity;
}
DateType&SeqList::operator[](int index)//数组索引
{
    return _array[index];
}
 //返回顺序表中的第一个元素 
DateType& SeqList::Front()
{
    return _array[0];
}
const DateType& SeqList::Front()const
{
    return _array[0];
}
// 返回顺序表中最后一个元素 
DateType& SeqList::Back()
{
    return _array[_size - 1];
}
const DateType& SeqList::Back()const{
    return _array[_size - 1];
}
void SeqList::reserve()//逆置
{
    int left = 0;
    int right = _size - 1;
    while (left <= right)
    {
        int temp = _array[left];
        _array[left] = _array[right];
        _array[right] = temp;
        left++;
        right--;

    }
}
void SeqList::resize(int newsize, const DateType&data)////将_size 到 size之间的元素赋值为data
{
    if (newsize <= _size)
    {
        _size = newsize;
    }
    else if ((_size<newsize) && (_capacity>newsize))
    {
        for (int i = _size; i < newsize; i++)
        {
            _array[i] = data;
        }
        _size = newsize;
    }
    else
    {
        DateType*temp = new DateType[newsize];
        for (int i = 0; i < _size; i++)
        {
            temp[i] = _array[i];
        }
        for (int i = _size; i < newsize; i++)
        {
            temp[i] = data;
        }
        delete[]_array;
        _array = temp;
        _size = newsize;
        _capacity = newsize;
    }
}
void SeqList::resize(int newsize)//resize的重载函数
{
    if (newsize < _size)
    {
        newsize = _size;
    }
    Capacity();
    if (_size < newsize)
    {
        for (int i = _size; i < newsize; i++)
        {
            _array[i] = 0;
        }
        _size = newsize;
    }
}
DateType SeqList::At(size_t index)
{
    return _array[index];
}
bool SeqList::empty()const
{
    if (_size == 0)
        return true;
    if (_size > 0)
        return false;
}
void  SeqList::clear()
{
    _size = 0;
}
void SeqList::Assign(size_t n, const DateType& data)
{
    delete[]_array;
    _array = NULL;
    _array = new DateType[n];
    for (int i = 0; i < n; i++)
    {
        _array[i] = data;
    }
    _size = n;
}
void SeqList::Assign(size_t n)
{
    delete[]_array;
    _array = NULL;
    _array = new DateType[n];
    _size = 0;
}
int main()
{
    SeqList s1(100, 3);
    s1.PushBack(6);
    s1.PushBack(7);
    s1.PushBack(8);
    s1.PushBack(9);
    cout << s1 << endl;
    s1.Insert(2, 5);
    cout << s1 << endl;
    s1.Erase(2);
    cout << s1 << endl;
    s1.PushFront(1);
    cout << s1 << endl;
    s1.PopFront();
    cout << s1 << endl;
    cout << s1.Front() << endl;
    cout << s1.Back() << endl;
    cout << s1.operator[](3) << endl;
    s1.reserve();
    cout << s1 << endl;
    s1.resize(20, 50);
    cout << s1 << endl;
    ////s1.resize(11);
    //cout << s1 << endl;
    cout << s1.At(1) << endl;
    /*s1.clear();
    cout << s1 << endl;
    cout << boolalpha << s1.empty() << endl;*/
    /*s1.Assign(5, 25);
    cout << s1 << endl;*/
    s1.Assign(5);
    s1.PushBack(1);
    cout << s1 << endl;
    system("pause");
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/xiaodu655/article/details/81409460