中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現動態順序表

發布時間:2022-02-23 13:37:42 來源:億速云 閱讀:125 作者:iii 欄目:開發技術

本篇內容主要講解“C++怎么實現動態順序表”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++怎么實現動態順序表”吧!

Vector.h

#pragma once 
#include <stdio.h>
#include <iostream>
#include <assert.h>
#include <string.h>
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)
      {
        _finish = _first + v.Size();
        _endofstorage = _first + v.Size();
      }
      else
      {
        _first = _finish = _endofstorage = NULL;
      }
    }
  }

  Vector& operator=(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();

      //現代寫法
      swap(_first, v._first);
      swap(_finish, v._finish);
      swap(_endofstorage, v._endofstorage);
    }
    return *this;
  }

  ~Vector()
  {
    delete[] _first;
    _first = _finish = _endofstorage = NULL;
  }

  void Print()
  {
    DataType* cur = _first;
    while (cur != _finish)
    {
      cout << *cur << " ";
      ++cur;
    }
    cout << endl;
  }

  size_t Size() const;
  size_t Capacity() const;
  void Expand(size_t n);
  void PushBack(DataType x);
  void Reserve(size_t n);
  void PopBack();
  void Insert(size_t pos, DataType x);
  void Erase(size_t pos);
  size_t Find(DataType x);
private:
  DataType* _first;
  DataType* _finish;
  DataType* _endofstorage;
};


size_t Vector::Size() const
{
  return _finish - _first;
}
size_t Vector::Capacity() const
{
  return _endofstorage - _first;
}
void Vector::Expand(size_t n)
{
  if (n > Capacity())
  {
    size_t size = Size();
    DataType* tmp = new DataType[n];
    memcpy(tmp, _first, sizeof(DataType)*size);
    delete[] _first;
    _first = tmp;
    _finish = _first + size;   //切記更新新的_finish和_endofstorage
    _endofstorage = _first + n;
  }
}
void Vector::PushBack(DataType x)
{
  //if (_finish == _endofstorage)
  //{
  // if (Capacity() == 0)
  // {
  //   Expand(3);
  // }
  // else
  // {
  //   Expand(Capacity() * 2);
  // }
  //}
  //*_finish = x;
  //++_finish;
  Insert(Size(), x);
}

void Vector::Reserve(size_t n)
{
  if (n > Capacity())
  {
    Expand(n);
  }
}

void Vector::PopBack()
{
  assert(_finish > _first);
  --_finish;
}

void Vector::Insert(size_t pos, DataType x)
{
  assert(pos <= Size());
  if (_finish == _endofstorage)
  {
    if (Capacity() == 0)
    {
      Expand(3);
    }
    else
    {
      Expand(Capacity() * 2);
    }
  }
  int end = Size() - 1;
  while (end >= (int)pos)
  {
    _first[end + 1] = _first[end];
    --end;
  }
  _first[pos] = x;
  ++_finish;
}

void Vector::Erase(size_t pos)
{
  assert(pos < Size());
  size_t cur = pos;
  while (cur < Size() - 1)
  {
    _first[cur] = _first[cur + 1];
    ++cur;
  }
  --_finish;
}

size_t Vector::Find(DataType x)
{
  DataType* cur = _first;
  while (cur != _finish)
  {
    if (*cur == x)
    {
      return cur - _first;
    }

    ++cur;
  }
  return -1;
}

void TestVector()
{
  Vector v1;
  v1.PushBack(1);
  v1.PushBack(2);
  v1.PushBack(3);
  v1.PushBack(4);
  v1.Print();
  size_t pos = v1.Find(2);
  printf("pos expect 1,actual %lu
", pos);

  Vector v2(v1);
  v2.Insert(0, 0);
  v2.Print();

  Vector v3;
  v3 = v2;
  v3.Print();
  v3.Erase(1);
  v3.Print();
}

test.cpp

#include "Vector.h"

int main()
{
  cout << "順序表:" << endl;
  TestVector();
  return 0;
}

到此,相信大家對“C++怎么實現動態順序表”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

高雄市| 桃源县| 怀远县| 凤山市| 阿坝| 历史| 遂平县| 无极县| 平阳县| 鲜城| 理塘县| 定边县| 凌云县| 阿勒泰市| 夏邑县| 城口县| 山东| 和平区| 台前县| 广汉市| 东兰县| 类乌齐县| 澳门| 华蓥市| 榆中县| 五指山市| 商南县| 大理市| 阿坝县| 林芝县| 襄樊市| 阳曲县| 肃南| 南阳市| 文昌市| 长乐市| 宣武区| 静宁县| 台前县| 密云县| 河南省|