什么是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;
}