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.mzph.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…