前言

  • 此处代码值得挖掘
  • 可以放到编译器中调试,学习
  • 模板、const、引用、、、、
  • 好好思考

代码

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
class Element {private:int number;
public:Element() :number(0) {cout << "ctor" << endl;}Element(int num) :number(num) {cout << "ctor" << endl;}Element(const Element& e) :number(e.number) {    //复制构造函数cout << "copy ctor" << endl;}Element(Element&& e) :number(e.number) {    //右值引用构造函数cout << "right value ctor" << endl;}~Element() {cout << "dtor" << endl;}void operator=(const Element& item) {number = item.number;}bool operator==(const Element& item) {return (number == item.number);}void operator()() {cout << number;}int GetNumber() {return number;}
};template<typename T>
class Vector {private:T * items;int count;
public:Vector() :count{ 0 }, items{ nullptr } {}Vector(const Vector& vector) :count{ vector.count } {items = static_cast<T*>(malloc(sizeof(T) * count));memcpy(items, vector.items, sizeof(T) * count);}Vector(Vector&& vector) :count{ vector.count }, items{ vector.items } {//TODOvector.count = 0;vector.items = nullptr;}~Vector() {    //调用Clear()函数,由于Clear()并不对items析构,且将count置为0,所以不会引发重复析构错误//TODOClear();delete items;}T& operator[](int index) {if (index < 0 || index >= count) {cout << "invalid index" << endl;return items[0];}return items[index];}int returnCount() {return count;}void Clear(){   //需要调用各个元素的析构函数,但是并不对items析构for (int i = 0; i < count; i++){items[i].~T();}items = nullptr;count = 0;}void Add(const T& item) {    //类似STL的Vector.push_back(),但是STL中Vector有预存的内存(capacity),不需要每次添加都重新分配//详细可以查看 Vector 的 push_back 实现原理T *newitems = static_cast<T*>(malloc(sizeof(T)*(count + 1)));for (int i = 0; i < count; i++){new(&newitems[i])T(move(items[i]));    //在新申请的内存构造对象,使用move可以调用对象的右值引用构造函数,提高效率}new(&newitems[count])T(move(item));for (int i = 0; i < count; i++){items[i].~T();    //释放原来的对象}items = newitems;    //保存重新申请的内存地址count++;}bool Insert(const T& item, int index) {//插入元素,操作同Add原理if (index < 0 || index >count)    //判断参数合法性{return false;}T *newitems = static_cast<T*>(malloc(sizeof(T)*(count + 1)));for (int i = 0; i < index; i++){new(&newitems[i])T(move(items[i]));}new(&newitems[index])T(move(item));for (int i = index; i < count; i++){new(&newitems[i + 1])T(move(items[i]));}for (int i = 0; i < count; i++){items[i].~T();}items = newitems;count++;return true;}bool Remove(int index) {//移除元素,操作同Add原理if (index < 0 || index >=count){return false;}T *newitems = static_cast<T*>(malloc(sizeof(T)*(count - 1)));for (int i = 0; i < index; i++){new(&newitems[i])T(move(items[i]));}for (int i = index; i < count-1; i++){new(&newitems[i])T(move(items[i+1]));}for (int i = 0; i < count; i++){items[i].~T();}items = newitems;count--;return true;}int Contains(const T& item) {    //寻找元素,匹配返回索引,不匹配返回-1for (int i = 0; i < count; i++){if (items[i] == item){return i;}}return -1;}
};template<typename T>
void PrintVector(Vector<T>& v) {    //遍历Vector输出int count = v.returnCount();for (int i = 0; i < count; i++){v[i]();cout << " ";}cout << endl;
}int main() {    //测试用例Vector<Element>v;for (int i = 0; i < 4; i++) {Element e(i);v.Add(e);}PrintVector(v);Element e2(4);if (!v.Insert(e2, 10)){v.Insert(e2, 2);}PrintVector(v);if (!v.Remove(10)){v.Remove(2);}PrintVector(v);Element e3(1), e4(10);cout << v.Contains(e3) << endl;cout << v.Contains(e4) << endl;Vector<Element>v2(v);Vector<Element>v3(move(v2));PrintVector(v3);v2.Add(e3);PrintVector(v2);return 0;
}

输出

ctor
copy ctor
dtor
ctor
right value ctor
copy ctor
dtor
dtor
ctor
right value ctor
right value ctor
copy ctor
dtor
dtor
dtor
ctor
right value ctor
right value ctor
right value ctor
copy ctor
dtor
dtor
dtor
dtor
0 1 2 3
ctor
right value ctor
right value ctor
copy ctor
right value ctor
right value ctor
dtor
dtor
dtor
dtor
0 1 4 2 3
right value ctor
right value ctor
right value ctor
right value ctor
dtor
dtor
dtor
dtor
dtor
0 1 2 3
ctor
ctor
1
-1
0 1 2 3
copy ctor
1
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor

C++使用move实现vector相关推荐

  1. STL源码剖析-vector

    1.vector扩容 (1)每次扩容是原来capacity的2倍,申请内容,将原内容copy到新内存.这些操作会影响到程序运行的效率,所以reserve()操作(提前分配一定量的内存)来避免不必要的重 ...

  2. std::move的使用

    std::move 简介 #include //使用的头文件 std::move将对象的所有权从一个对象转移到另外一个对象: std::string str1 = "string_1&quo ...

  3. Move 和 SimpleMove

    Move 不受重力影响, 不过受到collider的阻挡. Move (new Vector(0, 0, 1)) --- 向z轴移动动一单位 SimpleMove 受到重力影响, 也受到collide ...

  4. C++ vector类讲解

    今天在做一个学生类的管理系统时,由于没有用到数据库,这就需要一个可以容纳学生的容器.在网上找了一段时间,发现c++中的vector类可以较好的满足这样的要求,下面就简单的讲解一下c++中的vector ...

  5. <utility><xutility>模板常见操作方法

    //<utility><xutility>常见模板操作函数   /*template <class _Ty, size_t _Size, class>   inli ...

  6. Back-propagation, an introduction

    About Contact Subscribe Back-propagation, an introduction Sanjeev Arora and Tengyu Ma  •  Dec 20, 20 ...

  7. 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码

    较高人工智能的人机博弈程序实现(多个算法结合)含C++源码 本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday 上,您可以转载.引用.打印和分发等,但必须保留本文完整和 ...

  8. Pixhawk原生固件PX4之位姿控制算法解读

    参考文献:Minimum Snap Trajectory Generation and Control for Quadrotors PX4中多旋翼无人机的控制分为姿态控制和位置控制两个部分. 大致解 ...

  9. Pixhawk之姿态控制篇

    一.开篇 姿态控制篇终于来了.来了.来了~~~ 心情爽不爽?愉悦不愉悦?开心不开心? 喜欢的话就请我吃顿饭吧,哈哈. 其实这篇blog一周前就应该写的,可惜被上一篇blog霸占了.但是也不算晚,整理了 ...

最新文章

  1. 微软发布多项Azure Kubernetes服务更新,增加GPU支持
  2. VC++ MSXML创建XML文件以及对XML文档解析
  3. python的难点是什么_总结学习python的29个操作难点
  4. 采用C编写程序实现从文件读取操作
  5. 为什么当拖拽窗口时画面停止渲染?
  6. Python Cheat Sheet 中文版
  7. Urllib库的基本使用
  8. 凸优化第二章凸集 2.5 分离与支撑超平面
  9. Atitit 软件体系的进化,是否需要一个处理中心
  10. Verilog数字信号处理---基础1
  11. 用打印服务器打印 打印机显示脱机,打印机提示脱机使用,无法打印,该怎么解决?...
  12. VUE3 Composition API详解
  13. 使用git push没有报错,但是远程仓库没有更新的问题
  14. 如何进bios设置ssd固态硬盘为第一启动
  15. JavaWeb开发基础:连接数据库的demo和数据库连接工具类DB.java
  16. 在 UltraEdit /UEStudio 中配置自动更正关键字
  17. 深度硬核,思维导图拯救拖延症患者!
  18. 上蔡一高2021高考成绩查询,喜报!上蔡高考英雄榜出炉!
  19. 记录一次微信开发者工具打不开的坑
  20. 高分2(GF2)卫星数据系列处理

热门文章

  1. Are you happy today?快乐数
  2. 021 矩阵相似性质
  3. 殊不知这看似无心的摆放是设计者有意而为,二维码做到足够隐藏是需要艺术天分与想象的!
  4. Empowering End Users to Customize their Smart Environments: Model, Composition Paradigms and Domain
  5. 枚举-熄灯问题(算法基础 第2周)
  6. 计算机电源原如何确定正常,电脑电源故障迅速准确判断方法
  7. Redis五种类型的常用操作
  8. Java 用suo.nz给长链接生成短链接
  9. 原型图、交互设计、UI图的小结
  10. 突破性研究成果:验血就能检测癌症发现新系统性癌症标志物