C++(19)--自定義Array,vector練習

自定義Array,vector

  • 1.自定義Array
  • 2.自定義vector

《老九學堂C++課程》《C++ primer》學習筆記。《老九學堂C++課程》詳情請到B站搜索《老九零基礎學編程C++入門》
-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------

1.自定義Array

//main.cpp
#include <iostream>
#include "Array.h"
using namespace std;
void TestArray(){Array arr1(10);cout << arr1;arr1[0] = 1234;cout << arr1;
}
int main() {//TestIntefer();//TestString();TestArray();return 0;
}
//Array.h
//
// Created by 陳瑩瑩 on 2021/3/5.
//
#ifndef CHAPTER12_ARRAY_H
#define CHAPTER12_ARRAY_H
#include <iostream>
using namespace std;class Array {
public:Array(int lenght = 0);// 拷貝構造函數Array(const Array & arr);// 賦值運算符重載const Array & operator=(const Array & arr);// 重載輸出運算符friend ostream & operator<<(ostream & out, const Array & arr);// 重載[],實現下標索引和下標賦值// int operator[](int index);  // 獲取元素,無法寫入,這個編譯器只有返回值不同是不能夠重載的int & operator[](int index);  // 可以修改了~Array();
private:int m_lenght;int *m_data;     // 需要加啥?};#endif //CHAPTER12_ARRAY_H
//Array.cpp
//
// Created by 陳瑩瑩 on 2021/3/5.
//
#include <iostream>
#include <cstring>
#include "Array.h"
using namespace std;Array::Array(int lenght):m_lenght(lenght)
{if(m_lenght == 0){m_data = NULL;}else{m_data = new int[m_lenght];}
}
Array::Array(const Array & arr){if(arr.m_lenght == 0){return;}m_lenght = arr.m_lenght;m_data = new int[m_lenght];memcpy(m_data, arr.m_data, m_lenght*sizeof(int));}
const Array & Array::operator=(const Array & arr){if(this == &arr){return *this;}m_lenght = arr.m_lenght;m_data = new int[m_lenght];memcpy(m_data, arr.m_data, m_lenght*sizeof(int));return *this;}
ostream & operator<<(ostream & out, const Array & arr){for(int i = 0; i < arr.m_lenght; i++){out << arr.m_data[i] << ";";}out << endl;return out;
}
//int Array::operator[](int index) {
//    if(m_lenght==0){
//        cerr << "數組為空,訪問失敗!" << endl;
//    }
//    if(index < 0 || index >= m_lenght){
//        cerr << "數組下標越界!" << endl;
//    }
//    return m_data[index];
//}
int & Array::operator[](int index) {if(m_lenght==0){cerr << "數組為空,訪問失敗!" << endl;}if(index < 0 || index >= m_lenght){cerr << "數組下標越界!" << endl;}return m_data[index];
}
Array::~Array()
{delete[] m_data;
}

2.自定義vector

模版技術來實現

//main.cpp
#include <iostream>
#include "MyVector.h"
using namespace std;void TestVector(){MyVector<int> vec1;  // 默認構造MyVector<double> vec2(10,99.9);cout << "vec1" << vec1 << endl;cout << "vec2" << vec2 << endl;MyVector<string> vec3(5, string("abc"));cout << "vec3" << vec3 << endl;
//    vec3.push_back("123");
//    cout << "vec3" << vec3 << endl;  // 沒成功
}
int main() {//TestIntefer();//TestString();//TestArray();TestVector();return 0;
}
//Vector.h
//
// Created by 陳瑩瑩 on 2021/3/8.
// 自定義的容器類
// 使用的模版技術,一般用來做算法,比如重載100次某個類型的算法
// 如果使用模版技術,那么類的聲明和方法實現都要放在同一個頭文件中int GetMax(int num1, int num2);
double GetMax(double num1, double num2);
// 寫起來太麻煩了,需要使用模版技術來簡化一下
//tempalte<typename T1>   提示要建立心的T模版類
//T1 GetMax1(T1 num1, T1 num2);#ifndef CHAPTER12_MYVECTOR_H
#define CHAPTER12_MYVECTOR_H
#include <iostream>
#include <cstring>
using namespace std;//template<class T>    // 聲明了一個模版,之后這個T可以指代所有的東西(類型)
template<typename T>   // 新版本的C++的寫法class MyVector {
public:MyVector();MyVector(int len, T element); // 填充len長度的元素elementMyVector(const MyVector<T> & vec);   // Myvector<T>是這個類的類型,復制構造函數MyVector<T> & operator=(const MyVector<T> & vec);T & operator[](int index);void push_back(T element);     // 將元素element 添加到內部數組中T pop_back();                  // 返回并刪除最后一個元素void insert(int pos, T element); // 在pos位置處,插入元素elementvoid clear();                   //清空所有的元素template<class T2>friend ostream & operator<<(ostream & out, const MyVector<T2> & vec);~MyVector();
private:T * m_elements;   // 用來存放元素的數組int m_length;     // 所存放的實際個數int m_capacity;   // 當前元素數組的大小
};template<typename T>
MyVector<T>::MyVector():m_capacity(16), m_length(0)
{this->m_elements = new T[m_capacity];
}
template<typename T>
MyVector<T>::MyVector(int len, T element):m_capacity(16)
{m_capacity = len + m_capacity;m_length = len;m_elements= new T[m_capacity];// 使用for 循環復制for(int i = 0 ; i < m_capacity; i++){//m_element[i] = elemnet; // 注意:這里每次都會調用重載的賦值運算符memcpy(&m_elements[i], &element, sizeof(T)); // 不用重載復制運算符}
}
template<typename T>
MyVector<T>::MyVector(const MyVector<T> &vec)
{m_capacity = vec.m_capacity;m_length = vec.m_length;m_elements = new T[m_capacity];memcpy(m_elements, vec.m_elements, m_length * sizeof(T));
}
template<typename T>
MyVector<T> & MyVector<T>::operator=(const MyVector<T> & vec)
{if(this == vec) return *this;if(NULL != m_elements){   // 刪除原來的指針,產生新的指針delete[] m_elements;m_elements = NULL;}m_capacity = vec.m_length + vec.m_capacity;m_length = vec.m_length;m_elements= new T[vec.m_capacity];memcpy(m_elements, vec.m_elements, m_length * sizeof(T));return *this;
}
template<typename T>
T & MyVector<T>::operator[](int index) {return m_elements[index];
}template<typename T>
void MyVector<T>::push_back(T element)
{if(NULL == m_elements){m_capacity = 16;m_length = 0;m_elements = new T[m_capacity];}// 判斷當前的數組容量是否已滿if(m_length == m_capacity){// 如果滿了,就擴容:當前容量*2+1T * newElements = new T[m_capacity * 2 + 1];// 把原來的元素拷貝到新空間中memcpy(newElements, m_elements, m_length * sizeof(T));delete[] m_elements;m_elements = newElements;  // 指向新空間}// m_elements[m_length] = element; 要重載=memcpy(m_elements[m_length++], &element, sizeof(T));
}
template<class T2>
ostream & operator<<(ostream & out, const MyVector<T2> & vec)
{for(int i = 0; i < vec.m_length; i++){out << vec.m_elements[i] << "; ";}out << endl;return out;
}template<typename T>
MyVector<T>::~MyVector()
{delete[] m_elements;
}
#endif //CHAPTER12_MYVECTOR_H

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444785.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

讓cocos2dx支持并通過arm64 編譯

為了要支持64位,請把這個文件直接替換到對應的lib目錄下,本來是需要改neton_matrix_impl.c里的宏定義, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 為#if defined(_ARM_ARCH_7) 還有 third_party目錄下的curl的支持。

springboot——概述

Spring Boot 介紹 Spring Boot 是由 Pivotal 團隊提供的全新框架&#xff0c;其設計?的是?來簡化新 Spring 應? 初始搭建以及開發過 程&#xff0c;該框架使?了特定的?式來進?配置&#xff0c;從?使開發?員不再需要定義樣板化的配置。 默認配置了很多框架的使??式…

C++(20)--類型自動轉換

類型自動轉換1.C內置類型轉換2.實現自定義類的類型轉換《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》 -------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------…

關于遍歷linux的文件目錄的坑- readdir

去年給公司寫了一個配置服務器,目的是解決運維的工作量太大,而且傳送服務器需要的配置文件需要腳本傳送到各個服(每個服ip不一樣,需要scp),然后再刷新通知各個GameServer,中間有沒有傳送失敗并不得知,而且維護相當麻煩,所以我寫了這個服務器,所有區服的配置都在這里邊…

終于,我讀懂了所有Java集合——sort

Collections.sort 事實上Collections.sort方法底層就是調用的Arrays.sort方法&#xff0c;而Arrays.sort使用了兩種排序方法&#xff0c;快速排序和優化的歸并排序。 快速排序主要是對那些基本類型數據&#xff08;int,short,long等&#xff09;排序&#xff0c; 而歸并排序用于…

PRML(1)--緒論(上)多項式曲線擬合、概率論

PRML緒論1.1 多項式曲線擬合1.1.1 問題描述1.1.2 最小化平方和誤差1.1.3 多項式階數確定1.1.4 有趣問題--高階模型為什么效果不好1.1.4 數據集規模對模型的影響1.1.5 參數正則化緩解過擬合問題1.2 概率論1.2.1離散型隨機變量1.2.2 連續型隨機變量1.2.3 期望和方差1.2.4 貝葉斯概…

大數加減乘

如標題&#xff0c;不解釋。 加 #include<stdio.h> #include<string.h> int main() {char a[1000],b[1000];int i,s[1000],len1,len2,len,j;while(scanf("%s%s",a,b)!EOF) //用字符數組來儲存數{for(i0;i<1000;i)s[i]0;len1strlen(a);len2strlen(b…

在GCC和Visual Studio中使用hash_map

熟悉STL或熟悉ACM/ICPC的話&#xff0c;其中的set, map, multiset, multimap一定用過無數次了&#xff0c;它們都是用平衡二叉樹&#xff08;紅黑樹&#xff09;實現的&#xff0c;復雜度為O(lgn)。我們也知道set, map可以通過哈希來實現&#xff0c;復雜度只有O(1)&#xff0c…

C++(21)--Astah uml 畫C++類圖

Astah uml 畫C類圖1.安裝2.使用《老九學堂C課程》《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)--------------- ASTAH&#xff1a;類圖工具&#xff0c;用于理…

redis3.0.0 集群安裝詳細步驟

Redis集群部署文檔(centos6系統) &#xff08;要讓集群正常工作至少需要3個主節點&#xff0c;在這里我們要創建6個redis節點&#xff0c;其中三個為主節點&#xff0c;三個為從節點&#xff0c;對應的redis節點的ip和端口對應關系如下&#xff09; 127.0.0.1:7000 127.0.0.1:7…

Redis集群添加節點

Redis集群添加節點 1&#xff1a;首先把需要添加的節點啟動 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf /usr/local/cluster/7006/ cd /usr/local/cluster/7006/ vi redis.conf ##修改redis.conf中的port參數的值為7006 redis-server redis.c…

PRML(2)--緒論(下)模型選擇、緯度災難、決策論、信息論

PRML緒論1.3 模型選擇1.4 緯度災難1.5 決策論1.5.1最小錯誤分率1.5.2最小化期望損失1.5.3拒絕選項1.5.4推斷和決策1.5.5 回歸問題的損失函數1.6 信息論1.3 模型選擇 模型過復雜會造成過擬合問題&#xff0c;需要通過一些技術來降低模型的復雜度。 就最大似然而言&#xff0c;可…

leetcode112 路徑總和

給定一個二叉樹和一個目標和&#xff0c;判斷該樹中是否存在根節點到葉子節點的路徑&#xff0c;這條路徑上所有節點值相加等于目標和。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定如下二叉樹&#xff0c;以及目標和 sum 22&#xff0c; 5 / \ …

關于游戲架構設計的一些整理吧

一個大型的網落游戲服務器應該包含幾個模塊:網絡通訊,業務邏輯,數據存儲,守護監控(不是必須),其中業務邏輯可能根據具體需要,又劃分為好幾個子模塊。 這里說的模塊可以指一個進程,或者一個線程方式存在,本質上就是一些類的封裝。

linux時間輪 Timing-Wheel的實現

過一段時間上傳更新自己的心得&#xff0c;以及linux的時間輪實現 現在git上傳自己的C代碼 gitgithub.com:pbymw8iwm/Timing-Wheel.git

leetcode128 最長連續序列

給定一個未排序的整數數組&#xff0c;找出最長連續序列的長度。 要求算法的時間復雜度為 O(n)。 示例: 輸入: [100, 4, 200, 1, 3, 2] 輸出: 4 解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度為4 思路&#xff1a;map記錄某個連續序列端點的最大長度。 對于數字i&#xff…

C++(22)--繼承和派生

繼承和派生1.基本概念2.實現公有繼承3.私有繼承的例子4. 繼承和組合《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)----…

Python- 解決PIP下載安裝速度慢

對于Python開發用戶來講&#xff0c;PIP安裝軟件包是家常便飯。但國外的源下載速度實在太慢&#xff0c;浪費時間。而且經常出現下載后安裝出錯問題。所以把PIP安裝源替換成國內鏡像&#xff0c;可以大幅提升下載速度&#xff0c;還可以提高安裝成功率。 國內源&#xff1a; …

leetcode102 二叉樹的層次遍歷

給定一個二叉樹&#xff0c;返回其按層次遍歷的節點值。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 例如: 給定二叉樹: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其層次遍歷結果&#xff1a; [ [3], [9,20], [15…

Windows Git客戶端搭建

最近開始做Windows 開發&#xff0c;所以找了一些windows下安裝git的教程 本文環境&#xff1a; 操作系統&#xff1a;Windows XP SP3 Git客戶端&#xff1a;TortoiseGit-1.8.16.0-32bit 一、安裝Git客戶端 全部安裝均采用默認&#xff01; 1. 安裝支撐軟件 msysgit: http://ms…