自定义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

C++(19)--自定义Array,vector练习相关推荐

  1. array,vector对象 数组越界检测

    array,vector对象 数组越界检测 posted on 2017-11-15 16:20 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnbl ...

  2. 数据结构之 Array/Vector

    数据结构之 Array/Vector 写在前面 数据结构(按数据项间的逻辑次序划分) 线性表/序列(按存储结构划分) 顺序表/向量 基本操作(ADT接口) 写在前面 数据结构是数据项的结构化集合,其结 ...

  3. 利用std::allocator实现自定义的vector类

    std::allocator即空间配置器,用于内存分配.更多的细节建议大家研究相关源码. 这里仅是利用std::allocator来实现简单的自定义vector类,如有问题欢迎指正. 1 #inclu ...

  4. HDU1276 士兵队列训练问题【模拟+array+vector+list】

    士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. Array,Vector,List,Deque的区别与联系【转+改】

    数组 内存连续分配,长度大小固定,内置的最基础的数据结构之一.支持随机访问和随机存储. 该类型数据所占内存空间最小. Vector 是C++ STL中的一个容器.和数组类似,它拥有一段连续的内存空间, ...

  6. C++——获取array,vector,string的元素个数

    array: sizeof(array) / sizeof(array[0]) 如果为字符串的字符数组则为 sizeof(array) / sizeof(array[0]) - 1 vector: v ...

  7. C++ array vector 数组

    int main(){string names[4]={"张三","李四","王五"};//cout<<*(names+2)&l ...

  8. ExtJS EditorGridPanel 示例之Array格式(自定义Array解析器)Store前后台增删改查

    本示例入口html页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  9. Ksusha and Array (vector)

    题目链接:http://codeforces.com/problemset/problem/299/A 因为最大的数为十的九次方,所以我用了vector(根据输入的数据来分配相应的空间)来进行数据的存 ...

最新文章

  1. iOS学习之路十三(动态调整UITableViewCell的高度)
  2. 42. fastjson处理下划线和驼峰问题的方法和源码分析
  3. .NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据
  4. 差分约束 4416 FFF 团卧底的后宫
  5. 迈克尔·乔丹,无可复制的篮球之神!
  6. VS2017生成一个简单的DLL文件 和 LIB文件——C语言
  7. 【渝粤题库】广东开放大学 劳动心理学 形成性考核
  8. can't load apple.laf.AquaLookAndFeel (Ant in Eclipse can't find it
  9. 异构平台同步(Mysql到Oracle)
  10. 复工后,汉堡薯条、奶茶“续命”又开始了
  11. select 存储过程 mysql_MySQL存储过程无法使用SELECT(基本问题)
  12. Golang处理信号
  13. 搭建 Kodbox 私有云教程
  14. Linux gre tunnel 端口,两台Linux通过GRE tunnel的隧道实现互通 — 并且改变其中一台的回程路由...
  15. 软件设计师知识点100条(21~40)
  16. 大数据计算框架及引擎介绍
  17. sanicOpenApi 学习
  18. 关于发现宇宙微波背景(CMB)辐射的一则趣闻
  19. c语言能运行情书,用C语言写的情书
  20. nvm use命令出现乱码 exit status 145

热门文章

  1. wince6下usb摄像头(UVC)使用指南
  2. C# 监控字段_监控交换机选择:千兆/百兆/核心/PoE/光纤交换机选型指南
  3. python机器人算法_DBscan算法及其Python实现
  4. java codepointbefore_Java StringBuilder codePointBefore()方法与示例
  5. 【转】1.4异步编程:轻量级线程同步基元对象
  6. 认识ASP.NET 5项目结构和项目文件xproj
  7. 【Python CheckiO 题解】Between Markers
  8. Hexo 博客本地预览报错:Error: listen EADDRINUSE 0.0.0.0:4000
  9. 截屏当前界面_电脑屏幕怎么截取,常见的几种电脑截屏方法
  10. 【Kattis - triangle 】Sierpiński Circumference(数学,求位数,取对数或Java)