欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現(xiàn)動態(tài)線性表

 更新時間:2020年05月25日 10:14:54   作者:-yyqx-  
這篇文章主要為大家詳細介紹了C++實現(xiàn)動態(tài)線性表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

之前在學習c語言的時候用c語言實現(xiàn)了動態(tài)線性表?,F(xiàn)在再使用c++實現(xiàn)一下動態(tài)線性表。

相關數據結構方面就不多說了。在之前的博客里也有。下面就直接來實現(xiàn)吧。

這里使用指針來遍歷數組,這樣在算size,capacity的時候,直接用指針相減的方式就可以得到元素個數,以及容量。

Vector.h

#include <iostream>
#include<assert.h>
#include<stdio.h>
#include<string.h>
//用typedef定義int為存儲類型,想更改直接更改這一句即可。
typedef int DataType;

class Vector
{
public:
  //構造函數。
  Vector()
  {
    _first = new DataType[3];
    _finish = _first;
    _endofstorage = _first + 3;
  }
  //拷貝構造
  Vector(const Vector& v)
  {
    _first = new DataType[v.Size()];
    memmove(_first, v._first, v.Size()*sizeof(DataType));
    _finish = _first + v.Size() ;
    _endofstorage = _finish ;
  }
  //賦值運算符的重載
  Vector& operator=(Vector v);
  //析構函數
  ~Vector()
  {
    delete[] _first;
  }
  //順序表的有效長度
  size_t Size() const
  {
    return _finish - _first ;
  }
  //順序表的容量
  size_t Capacity() const
  {
    return _endofstorage - _first ;
  }
  //擴容順序表
  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);
  //打印當前順序表
  void Print();
private:
  //指向第一個元素的指針
  DataType* _first;
  //指向最后一個有效元素的下一個位置
  DataType* _finish;
  //順序表容量的下一個位置
  DataType* _endofstorage;
};

Vector.cpp

#include"Vector_List1.h"

  //賦值運算符的重載可以使用傳值的方式進行
  //在傳值的時候默認調用了拷貝構造函數,進行了深拷貝
  //而當前這個傳入的v就是我們想要的賦值之后的結果
  //將當前的順序表與順序表v一交換,就可以不用再自己實現(xiàn)深拷貝
  Vector& Vector::operator=(Vector v)
  {
    size_t size = v.Size();
    DataType *tmp = v._first;
    v._first = _first;
    _first = tmp;
    _finish = _first + size;
    _endofstorage = _finish;
    return *this;
  }
  void Vector::Expand(size_t n)
  {
    DataType *tmp = new DataType[n];
    size_t size = Size();
    memmove(tmp, _first, Size()*sizeof(DataType));
    delete[] _first;
    _first = tmp;
    _finish = _first + size;
    _endofstorage = _first + n;
  }
  void Vector::PushBack(DataType x)
  {
    if (_finish > _endofstorage)
      Expand(2 * Capacity());
    *_finish = x;
    _finish++;
  }
  void Vector::PopBack()
  {
    assert(_first < _finish);
    _finish--;
  }
  void Vector::Insert(size_t pos, DataType x)
  {
    assert(pos<Size());
    if(_finish >= _endofstorage)
      Expand(2*Capacity());
    memmove(_first+pos+1,_first+pos,Size()-pos+1);
    *(_first+pos) = x;
  }
  void Vector::Erase(size_t pos)
  {
    assert(pos<Size());
    memmove(_first+pos,_first+pos+1,(Size()-pos-1)*sizeof(DataType));
    _finish--;
  }
  size_t Vector::Find(DataType x)
  {
    DataType *tmp = _first;
    while(tmp != _finish)
    {
      if(*tmp == x)
        return tmp-_first;
      else
        tmp++;
    }
    return -1;
  }
  //截取n個字符
  void Vector::Reserve(size_t n)
  {
    //如果n<capacity,則什么都不做,將其容量降為size與n之間的最大值
    //會改變capacity,不會改變size,若n>capacity擴容,
    if(n<Capacity())
    {
      _endofstorage = _first + ( n > Size() ? n : Size());
      return;
    }
    else if(n>Capacity())
    {
      Expand(n);
      return;
    }
    else
      return;
  }   
  void Vector::Print()
  {
    DataType *tmp = _first;
    while (tmp != _finish)
    {
      printf("%d ", *tmp);
      tmp++;
    }
    printf("\n");
  }
int main()
{
  Vector v;
  Vector v1(v);
  v.PushBack(1);
  v.PushBack(2);
  v.PushBack(3);
  v.PushBack(4);
  v.PushBack(5);
  v.PushBack(6);
  v.Print();
  v1 = v;
  v1.Print();
  v1.Erase(2);
  v1.Print();
  size_t ret = v1.Find(3);
  printf("%lu\n",ret);
  ret = v1.Find(2);
  printf("%lu\n",ret);
  ret = v1.Find(5);
  printf("%lu\n",ret);
  v1.Reserve(3);
  v1.Print();
  return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++實踐分數類中運算符重載的方法參考

    C++實踐分數類中運算符重載的方法參考

    今天小編就為大家分享一篇關于C++實踐分數類中運算符重載的方法參考,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C/C++使用過程中的溢出問題詳解

    C/C++使用過程中的溢出問題詳解

    在C/C++程序里有一類非常典型的問題,那就是:溢出問題,現(xiàn)在分別來分析一下常見的數組溢出,整數溢出,緩沖區(qū)溢出,棧溢出和指針溢出等,需要的朋友可以參考下
    2024-01-01
  • C++通信新特性協(xié)程詳細介紹

    C++通信新特性協(xié)程詳細介紹

    這篇文章主要給大家分享得是C++的特性協(xié)程Coroutine,下面文章內容我們將來具體介紹什么是協(xié)程,協(xié)程得好處等知識點,需要的朋友可以參考一下
    2022-10-10
  • QT通過C++線程池運行Lambda自定義函數流程詳解

    QT通過C++線程池運行Lambda自定義函數流程詳解

    最近在接觸公司的一個QT桌面項目,其中里面有一個模塊是使用線程池去運行自定義函數的,自己潛心研究那個線程池代碼一天,發(fā)現(xiàn)研究不透,看不懂,里面幾乎都是使用C++11的新特性進行編寫
    2022-10-10
  • win10系統(tǒng)下?VS2019點云庫PCL1.12.0的安裝與配置教程

    win10系統(tǒng)下?VS2019點云庫PCL1.12.0的安裝與配置教程

    點云庫全稱是Point?Cloud?Library(PCL),是一個獨立的、大規(guī)模的、開放的2D/3D圖像和點云處理項目,這篇文章主要介紹了win10系統(tǒng)下?VS2019點云庫PCL1.12.0的安裝與配置,需要的朋友可以參考下
    2022-07-07
  • C++開發(fā)在IOS環(huán)境下運行的LRUCache緩存功能

    C++開發(fā)在IOS環(huán)境下運行的LRUCache緩存功能

    本文著重介紹如何在XCODE中,通過C++開發(fā)在IOS環(huán)境下運行的緩存功能。算法基于LRU,最近最少使用,需要的朋友可以參考下
    2012-11-11
  • C++全面細致講解復數類

    C++全面細致講解復數類

    本文章向大家介紹C++ 標準庫中的復數類,主要包括C++ 標準庫中的復數類使用實例、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下
    2022-06-06
  • C++模板template用法小結(推薦)

    C++模板template用法小結(推薦)

    這篇文章主要介紹了C++模板template用法總結 ,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • VSCode插件開發(fā)全攻略之跳轉到定義、自動補全、懸停提示功能

    VSCode插件開發(fā)全攻略之跳轉到定義、自動補全、懸停提示功能

    這篇文章主要介紹了VSCode插件開發(fā)全攻略之跳轉到定義、自動補全、懸停提示,需要的朋友可以參考下
    2020-05-05
  • C語言深入探究函數的溯源

    C語言深入探究函數的溯源

    函數是一組一起執(zhí)行一個任務的語句。每個 C 程序都至少有一個函數,即主函數 main() ,所有簡單的程序都可以定義其他額外的函數
    2022-04-04

最新評論