C++实现动态顺序表(vector)

 更新时间:2020年05月25日 10:44:35   作者:get_it_started  
这篇文章主要为大家详细介绍了C++实现动态顺序表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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){
   /*swap(_first, v._first);
   swap(_finish, v._finish);
   swap(_endofstorage, v._endofstorage);*/

   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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++如何调用python并取返回值

    C++如何调用python并取返回值

    这篇文章主要介绍了C++如何调用python并取返回值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • C++中strlen(),sizeof()与size()的区别

    C++中strlen(),sizeof()与size()的区别

    本文主要介绍了C++中strlen(),sizeof()与size()的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C++文件上传、下载工具

    C++文件上传、下载工具

    这篇文章主要为大家详细介绍了C++文件上传、下载工具的相关资料,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • C++示例讲解friend static const关键字的用法

    C++示例讲解friend static const关键字的用法

    静态成员static是解决同一个类的不同对象之间数据和函数共享问题。区分全局变量,全局变量也能实现数据共享,但安全性和封装性被破坏了,友元提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制,const常引用-被引用的对象不能被更新
    2022-06-06
  • C语言实现六边形扫雷游戏的示例代码

    C语言实现六边形扫雷游戏的示例代码

    所谓六边形扫雷,就是没有扫雷模式的消零算法,每一个安全的点都需要单独挖出来,一次显示一个格子,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C语言版的三子棋游戏

    C语言版的三子棋游戏

    这篇文章主要为大家详细介绍了C语言版的三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++实现与Lua相互调用的示例详解

    C++实现与Lua相互调用的示例详解

    这篇文章主要为大家详细介绍了C++实现与Lua相互调用的方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++发送邮件实现代码

    C++发送邮件实现代码

    这篇文章主要为大家详细介绍了C++发送邮件的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C语言动态规划多种背包问题分析讲解

    C语言动态规划多种背包问题分析讲解

    背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高
    2022-04-04
  • 剖析C++中的常量表达式与省略号的相关作用

    剖析C++中的常量表达式与省略号的相关作用

    这篇文章主要介绍了C++中的常量表达式与省略号的相关作用,以及表达式中的可变参数模板示例,需要的朋友可以参考下
    2016-01-01

最新评论