亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

相關(guān)數(shù)據(jù)結(jié)構(gòu)方面就不多說了。在之前的博客里也有。下面就直接來實現(xiàn)吧。

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

Vector.h

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

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

Vector.cpp

#include"Vector_List1.h"

  //賦值運(yùn)算符的重載可以使用傳值的方式進(jìn)行
  //在傳值的時候默認(rèn)調(diào)用了拷貝構(gòu)造函數(shù),進(jìn)行了深拷貝
  //而當(dāng)前這個傳入的v就是我們想要的賦值之后的結(jié)果
  //將當(dāng)前的順序表與順序表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擴(kuò)容,
    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;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實踐分?jǐn)?shù)類中運(yùn)算符重載的方法參考

    C++實踐分?jǐn)?shù)類中運(yùn)算符重載的方法參考

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

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

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

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

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

    QT通過C++線程池運(yùn)行Lambda自定義函數(shù)流程詳解

    最近在接觸公司的一個QT桌面項目,其中里面有一個模塊是使用線程池去運(yùn)行自定義函數(shù)的,自己潛心研究那個線程池代碼一天,發(fā)現(xiàn)研究不透,看不懂,里面幾乎都是使用C++11的新特性進(jìn)行編寫
    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)境下運(yùn)行的LRUCache緩存功能

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

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

    C++全面細(xì)致講解復(fù)數(shù)類

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

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

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

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

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

    C語言深入探究函數(shù)的溯源

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

最新評論