时间:2021-05-20
vector是连续存储结构,支持随机的高效的随机和在尾部进行插入、删除操作,其它位置的插入、删除操作相对来说效率较低。
vector相当于一个数组,但它的数组空间大小需要写一程序来实现。
它的内存分配原理大概可分为下面几步:
1)首先分配一块内存空间进行存储;
2)当所需存储的数据超过分配的空间时,再重新分配一块空间;
3)将旧元素复制到新空间;
4)释放旧空间。
实现代码如下:
vector.h
#pragma once#include<stdio.h>#include<assert.h>#include<string.h>#include<iostream>using namespace std;typedef int DataType;class Vector{public: Vector() :_first(NULL), _finish(NULL), _endofstorage(NULL) {} Vector(const Vector& v){ if (v.Size() > 0){ _first = new DataType(v.Size()); memcpy(_first, v._first, sizeof (DataType)*v.Size()); } if (_first > 0){ _finish = _first + v.Size(); _endofstorage = _first + v.Size(); } _first = _finish = _endofstorage = NULL; } Vector& operator=(const Vector& v){ if (this != &v){ DataType* tmp = new DataType(v.Size()); memcpy(tmp, _first, sizeof(DataType)*v.Size()); delete _first; _first = tmp; _finish = _first + v.Size(); _endofstorage = _first + v.Size(); } return *this; } ~Vector(){ delete[] _first; _first = _finish = _endofstorage = NULL; } void Print(){ DataType* cur = _first; while (cur != _first){ cout << "*cur" << endl; cur++; } cout << endl; } size_t Size() const{ return _finish - _first; } size_t Capacity() const{ return _endofstorage - _first; } void Expand(size_t n){ if (n > Capacity()){ DataType* tmp = new DataType(n); size_t size = Size(); memcpy(tmp, _first, sizeof(DataType)*size); delete[] _first; _first = tmp; _finish = _first + size; _endofstorage = _first + n; } } void PushBack(DataType x){ if (_finish == _endofstorage){ size_t capacity = Capacity() > 0 ? Capacity() * 2 : 3; Expand(capacity); /*if (Capacity() == 0){ Expand(3); } else{ Expand(Capacity() * 2); }*/ } *_finish = x; ++_finish; } void PopBack(){ assert(_finish > _first); --_finish; } void Reserve(size_t n){ if (n > Capacity()){ Expand(n); } } void Insert(size_t pos, DataType x){ assert(pos < Size()); if (_finish = _endofstorage){ size_t capacity = Capacity() > 0 ? Capacity() * 2 : 3; Expand(capacity); } int tmp = Size() - 1; while (tmp >= (int)pos){ _first[tmp + 1] = _first[tmp]; --tmp; } _first[pos] = x; ++_finish; } void Erase(size_t pos){ assert(pos < Size()); size_t cur = pos; while (cur < Size()-1){ _first[cur] = _first[cur] + 1; ++cur; } --_finish; } size_t Find(DataType x){ DataType *cur = _first; while (cur != _finish){ if (*cur == x){ return cur - _first; } ++cur; } return -1; }private: DataType* _first; DataType* _finish; DataType* _endofstorage;};test.cpp
#include"vector.h"void Tset(){ Vector v; v.PushBack(1); v.PushBack(2); v.PushBack(3); v.PushBack(4); v.PopBack(); v.Print(); size_t pos = v.Find(1); printf("pos->data:expcet 1,axtual %lu", pos); Vector v1; v1.Insert(1, 0); v1.Print(); Vector v2; v2.Erase(3); v2.Print();}int main(){ Tset(); return 0;}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了C++实现动态顺序表的具体代码,供大家参考,具体内容如下Vector.h#pragmaonce#include#include#includ
简介向量(Vector)是一个封装了动态大小数组的顺序容器。向量是一个能够存放任意类型的动态数组。C++中Vector的使用头文件#include需要使用std
本文实例为大家分享了C++实现动态顺序表的具体代码,供大家参考,具体内容如下List.h#pragmaonce#include#include#includeu
c++vector用法C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。要解决此问题我们自己实现这样的类。在标准C++中,用容器向量(vector)实
本文实例为大家分享了C++实现顺序表的具体代码,供大家参考,具体内容如下#includeusingnamespacestd;typedefintDataType