C++向量Vector模板的实现

C++模板类实现Vector Vector<int> Vector<char> Vector<String> 阅读详情

在项目中需要使用向量的时候,可以使用C++自带的vector.h来实现向量的存储,也可以自己实现向量的类。。

下面给出自己定义的向量类,需要什么函数都可以自己定义,是不是来的很方便呢。。。。:

/*********************************************************************/
/*                                                                   */
/*  Xiaoding: Vector C++ Library                                     */
/*                                                                   */
/*                                                                   */
/*   Poject Speech                                                   */
/*   Date:2012.03                                                    */
/*   E-mail: mdd_133@163.com                                         */
/*                                                                   */
/*********************************************************************/
#ifndef   _VECTOR_H
#define   _VECTOR_H  //防止头文件重复定义
#include <iostream>
#include <sstream>
#include <string>
#include <cstdlib>
#namespace Xiaoding
{
   template <class Type>
   class Vector
   {
   public:
	    explicit Vector(void); //默认构造函数
		explicit Vector(int );//向量大小构造函数 防止通过隐式转换来调用这个构造函数
		explicit Vector(int, const Type&);//初始化大小,并赋初值
	    Vector(const Vector&); //复制构造函数
		virtual ~Vector(void); //析构函数
		//操作符重载函数
		Vector& operator = (const Vector&);
        inline Type& operator [] (int);
        //inline const Type& operator [] (int) const;
		
	friend std::ostream& operator<<(std::ostream& out, const Vector<Type>& V); //输出运算符重载
	//算术操作符重载
   Vector<Type> operator + (const Type&) const;
   Vector<Type> operator + (const Vector<Type>&) const;

   inline int get_size(void) const;
   private: 

   int size; //向量大小
   bool display; //是否显示标志
   /// 指向数据的指针
   Type *data; 

   };

  //创建一个大小为0的向量
  template <class Type>
Vector<Type>::Vector(void)
{
   size = 0;
   display = true;
   data = NULL;
}

/// @param new_size 向量的大小
template <class Type>
Vector<Type>::Vector(int new_size)
{
   // (if debug)      

   #ifdef _DEBUG 

   if(new_size < 0)
   {
	   std::cout << "Xiaoding Error: Vector Template." << std::endl 
		   << "Vector(int) constructor." << std::endl
                << "Size must be equal or greater than zero." <<endl;

      exit(1);
   }

   #endif
   
   size = new_size;
   display = true;
   data = new Type[new_size];
}

//创建一个大小为new_size的向量,并用类型为Type的值给向量赋初值
template <class Type>
Vector<Type> ::Vector(int new_size, const Type& value) 
{
   // Control sentence (if debug)      

   #ifdef _DEBUG 

   if(new_size < 0)
   {
	   std::cerr << "Xiaoding Error: Vector Template." << std::endl 
		   << "Vector(int, const Type&) constructor." << std::endl
		   << "Size must be equal or greater than zero." << std::endl;

      exit(1);
   }

   #endif
   
   size = new_size;
   display = true;
   data = new Type[new_size];
   
   for(int i = 0; i < size; i++)
   {
      data[i] = value;
   }
}

//复制构造函数,复制一个已经存在的向量,other_vector 为被赋值的向量
template <class Type>
Vector<Type>::Vector(const Vector<Type>& other_vector) 
{
   size = other_vector.size;
   display = true;
   data = new Type[size];

   // Control sentence (if debug)      
       
   for(int i = 0; i < size; i++)
   {
      data[i] = other_vector[i];
   }
}

//析构函数
template <class Type> 
Vector<Type>::~Vector(void)
{
   if(data != NULL)
   {
      delete[](data);
   }
}

//赋值运算符重载,将一个向量赋给另一个向量
template <class Type>
Vector<Type>& Vector<Type>::operator = (const Vector<Type>& other_vector)
{
   if(this != &other_vector) // other vector
   {
      if(size != other_vector.get_size()) // other size
      {
         if(data != NULL)
         {
            // Control sentence (if debug)      
       
            //#ifdef _DEBUG 
            //cout << "Xiaoding Warning: Vector Template." << endl 
            //          << "Vector& operator = (const Vector<Type>&)." << endl
            //          << "Assignment operator to non-empty vector." << endl;     
            //#endif

            delete [] (data);
         }

         size = other_vector.size;

         data = new Type[size];
      }

      for(int i = 0; i < size; i++)
      {
         data[i] = other_vector[i];
      }

	  display = true;//把other_vector的display的熟悉赋给它
   }

   return(*this);
}

//返回向量索引为i的值
template <class Type>
inline Type& Vector<Type>::operator [] (int i) 
{
   // Control sentence (if debug)

   #ifdef _DEBUG 

   if(size == 0)
   {
	   std::cerr << " Xiaoding Error: Vector Template. " << std::endl
                << "Reference operator []." << std::endl
                << "Size of vector is zero." << std::endl;

      exit(1);
   }
   else if(i < 0)
   {
      std::cerr << "Xiaoding Error: Vector Template. " << std::endl
                << "Reference operator []." << std::endl
                << "Index must be equal or greater than zero." << std::endl;

      exit(1);
   }
   else if(i >= size)
   {
      std::cerr << "Xiaoding Error: Vector Template. " << std::endl
                << "Reference operator []." << std::endl
                << "Index is " << i << " and it must be less than " << size << "." << std::endl;

      exit(1);
   }

   #endif

   // Return vector element

   return(data[i]);
}

template <class Type> 
std::ostream &operator<<(std::ostream &out, const Vector<Type>& V)  
{  
	
	for(int i=0;i<V.size;i++)  
    {  
		std::out<<V.data[i]<<" ";  
       if((i+1)%10==0)  
		   std::out<<endl;  
    }  
	return std::out;  
}  

//给向量加上一个值 vector+scalar
template <class Type>
Vector<Type> Vector<Type>::operator + (const Type& scalar) const
{       
   Vector<Type> sum(size);

   for(int i = 0; i < size; i++)
   {
      sum[i] = data[i] + scalar;
   }
   
   return(sum);
}

//一个向量加上另一个向量
template <class Type>
Vector<Type> Vector<Type>::operator + (const Vector<Type>& other_vector) const
{       
   // Control sentence (if debug)

   #ifdef _DEBUG 

   int other_size = other_vector.get_size();

   if(other_size != size)
   {
      std::cerr << "Xiaoding Error: Vector Template. " << std::endl
                << "Vector<Type> operator + (const Vector<Type>) const." << std::endl
                << "Size of vectors is " << size << " and " << other_size << " and they must be the same." 
                << std::endl;

      exit(1);          
   }

   #endif

   Vector<Type> sum(size);
  
   for(int i = 0; i < size; i++)
   {
      sum[i] = data[i] + other_vector[i];
   }
   
   return(sum);
}

template <class Type>
inline int Vector<Type>::get_size(void) const
{
   return(size);
}


}

#endif


 

 

C++模板编程——实现C++ STL向量容器vector、容器空间配置器allocator的重要性 实现C++ STL向量容器vector vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。我们把 vector 称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。 使用 vector 之前,必须包含相应的头文件: #include < vector > using st... 阅读详情

相关推荐

C++三维向量叉乘实现:从数学公式到工业级代码的工程实践

向量运算,特别是点乘与叉乘,是计算机图形学、物理引擎和游戏开发等领域的数学基石。其原理基于线性代数,通过坐标分量的特定组合计算,能高效表征几何关系与空间变换。在工程实践中,将数学公式转化为健壮、高效的C++代码面临诸多挑战,如浮点精度处理、接口设计和性能优化。本文以三维向量叉乘为核心,深入探讨如何构建一个模板化、支持完整算术运算的Vector3类,涵盖精度控制、SIMD优化思路及归一化等常见陷阱的解决方案,并展示其在计算面法线、物理扭矩和构建正交坐标系等场景中的具体应用,为开发高性能数学库提供实战参考。

weixin_33178839的博客 336

C++ 简单Vector模板类

刚接触类的相关内容,完成了简单的Vector模板类的项目。 用template 来实现n维向量的相关性质。 写的时候其中有几个关键的地方 1.模板类的函数定义必须和头文件放在一个cpp文件里,系统不支持模板类的单独编译。 2.定义模板类的成员(友元)函数时,都要加 template   or template 。 3.对于模板类的友元函数,都声明成了非约束(unbound)模板友元。 

Jazz_Charles的博客 1523

C++模板编程—学习C++类库的编程基础

施磊C++语言基础提高课程笔记,包括了详解函数模板,类模板,理解容器空间配置器allocator的重要性,实现C++STL向量容器vector代码

GeniusAng的博客 1043

vector模板类的简单实现 C++

     学了模板类那一节,所以动手自己用C++简单实现了一下 vector 的几个简单函数。直接上代码吧   #include&lt;iostream&gt; #include&lt;string&gt; #include&lt;cassert&gt; using namespace std; template &lt;typename T&gt; class Myvector { pub...

阳光那么暖。 2278

c++向量模板(myVector)

自己写的一个向量模板类,大家可以参考学习一下。

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1358

vector模板类的C++实现

/* 2017/07/19 Liu YK */#pragma once #include <cassert> #include <iostream> #include <cstdlib> #include <ctime>namespace MYSTL { typedef int Rank; const int DEFAULT_CAPACITY = 5; template<typ

执念如此Arcon的博客 4631

音视频入门:H264、H265概念总结

添加链接描述 什么是H.264与H.265 H.264与H.265都是视频压缩格式,由于视频本身的码流太大,所以需要经过压缩然后再通过网络进行传输。H.264是目前比较主流的压缩算法,像视频会议设备一般都采用这个编码格式。基础的H.264可以支持在1M带宽下传输720P30帧/秒的图像;H.264 HIGH PROFILE支持在512K带宽下传输720P30帧/秒的图像。 H.265是比较新的压缩算法,可以更一步提高压缩比,随着我们现在生活中出现的视频格式越来越大(比如现在基本都是1080P甚至4K的显示器

weixin_40673765的博客 8936

【C++】vector 模拟实现

文章目录一.vector介绍二. vector的模拟实现1. private成员变量及迭代器2. 容量操作接口2.1 size和capacity2.2 reserve2.2 resize3. 默认成员函数3.1 构造函数3.2 拷贝构造3.3 赋值重载4. 修改操作接口4.1 insert4.2 erase 一.vector介绍 vector是表示可变大小数组的序列容器 就像数组一样,vector也采用连续的存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不

m0_51064412的博客 1968

怎样自己亲手搭建一个四比特加法器

如何用三极管搭建一个四比特加法器 一、前言 作为大一上学期第一个大作业,最终还是拖到了冬学期的第八周,从第七周的周六开始,一直到第八周周五上午课上展示,中间连续熬了好几天的夜,另外,白天凡是有时间都用在研究它了,最终大约是用了30个小时,完成了这个四比特加法器的“从零到一”。 最终,小组得分92,个人分数100(贡献比35%),也不枉自己投入的心血 二、器材 电阻 1 包(10kΩ×100,1kΩ×50) 三极管 1 包(9013×100,LED×6) 跳线 3 短 1.5 长 电源 1 个 USB 线

qq_34771124的博客 1万+

SAP_MM模块采购订单显示含税价&不含税简介

不含税价(Net Price):基础商品价格,不包含税金。含税价(Gross Price):基础价格加上适用税金后的总价。在SAP中,采购订单通常以不含税价为基础,通过配置税码和定价方案,系统会自动计算含税总价。

我小时候很黑的博客 2300

C++使用模板重载vector的加减法实现矩阵向量加减法

C++已经有许多实现矩阵运算的库,这些库功能齐全,但是有些时候我们可能只需要用到矩阵的加减法等简单的功能,这时候引入这些库显得有些大材小用。这时候,使用STL的vector类并重载operator+来实现矩阵或者向量的加减就十分方便。 但是,我们在处理一维和二维,甚至三维的矩阵时,可能会对不同类型的vector进行重复的重载,这无疑使代码显得有些冗余,而且不易维护。这时,自然想到利用C++的模板来...

centurionAX的博客 3881

量化交易python代码解析:从狙击手算法到最优限价算法

在金融市场的竞技场上,量化交易如同一位冷静的策略大师,它以数学模型为剑,以计算机程序为盾,精准出击,捕捉市场的微妙波动。本文将深入探讨五种核心量化交易算法:直接委托算法(DMA)、时间加权平均算法(TWAP)、冰山算法(Iceberg)、狙击手算法(Sniper)、条件委托算法(Stop)以及最优限价算法(BestLimit),揭开它们背后的运作机制与实战应用。

木头大左的博客 1884

C++小例子——04 列向量模板类ColVector

把03列向量类改成了模板类,如此一来,列向量的元素类型不再局限于double,而可以是vector,tensor等。为了把头文件和cpp文件分开处理,头文件中需要对模板类进行实例化声明。

meiguanhua的博客 623

YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入LCGA局部曲率引导注意力,保持局部稳定性的同时突出关键几何区域,含多种创新改进,促进YOLO26所有任务高效涨点

🔥本文提出LCGA(局部曲率引导注意力)模块,通过引入曲率信息改进YOLO26网络模型。LCGA在局部窗口内利用深度卷积构造曲率代理,调制标准窗口注意力,使模型更关注道路、边界等曲线型结构,提升遥感图像超分辨率中的几何保真度。相比普通注意力,LCGA能精准聚焦关键几何区域,减少边缘断裂和轮廓偏移,同时保持较低计算开销。实验表明LCGA显著提升性能,在UCMerced数据集上PSNR提升0.2148dB。文章提供了三种改进方案。

Ai缝合怪、助力小伙伴高效发论文 226

pybind11_examples实战:01_py-list_cpp-vector教你实现Python列表与C++向量互转

pybind11_examples是一个专注于展示pybind11用法的示例项目,通过实际案例帮助开发者掌握Python与C++之间的数据交互技巧。本文将以01_py-list_cpp-vector模块为例,详细讲解如何实现Python列表与C++向量的高效互转。 ## 为什么需要Python与C++数据互转? 在实际开发中,Python以其简洁易用的特性适合快速开发和数据处理,而C++则在性

gitblog_00972的博客 825

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 762

【c++模板】——STL向量容器vector以及容器空间配置器alloctor的实现

文章目录一、STL向量容器vector简单实现二、容器空间适配器allocator简单实现 一、STL向量容器vector简单实现 1、容器的定义 首先,我们来了解一下什么是容器,他的书面解释各位可以百度,在这儿我们就用一种通俗的方式来解释他,容器就是保存其他对象的对象。而且这种对象还有处理其他对象的方法。 C++采用基于模版的方式处理容器,STL中的容器提供了多种数据结构。 2、vector容器...

qq_43412060的博客 455

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++模板三:STL向量容器vector简单实现、容器空间适配器allocator简单实现

文章目录一、STL向量容器vector简单实现二、容器空间适配器allocator简单实现 一、STL向量容器vector简单实现 首先,我们了解一下什么是容器呢? 容器:在C++中,容器被定义为:在数据存储上,有一种对象类型,它可以持有其他对象或指向其他对象的指针,这种对象类型就叫做容器。 简单理解,即容器就是保存其他对象的对象。而且,这种“对象”还有处理“其他对象”的方法。 我们平常喝水的的...

Rain的博客 777

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

施磊老师c++笔记(三)

模板编程, 容器配置空间allocator

weixin_65612492的博客 1171

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++函数返回二维数组_C++ 返回数组

C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现。比如一个矩阵相乘的函数,很容易地我们就写成: 1#include 2 3usingnamespacestd; 4 5float*MultMatrix(floatA[4],floatB[4]) 6{ 7floatM[4]; 8M[0]=A[0]*B[0]+A[1]*B[2]; 9M[1]=A[0]*B[1]+A[1]*B[3]...

Aaronwqa的博客 657

【C++】XYZ系列——Vector3类模板(仿Unity实现)

序言随着Unity技术的全球性大规模普及,其API的易用性得到了越来越多的开发者的青睐。本篇在D子宇的工作基础上,仿照Unity的类结构,将其拓展转换为C++类模板。以便在其它C++工程中更加方便使用。源代码地址:https://github.com/duzixi/XYZ博文首发:https://www.youkuaiyun.com/duzixi源代码Vector3.h// // Vector3.h // ...

杜子兮@优快云 3258

示例:通过C++模板定义Vector类

一个示例C++程序,演示通过模板定义Vector向量类 转载于:https://my.oschina.net/silverstone/blog/7793...

chenghongxi2156的博客 238

C++之 向量、模板和异常(一)

向量、模板和异常 STL容器vector的设计与实现。 问题 vector<double> vd; //double类型元素 for(double d; cin>>d;) vd.push_back(d); //扩展vd以容纳所有元素 vector<char> vc(100); //char类型元素 int n; cin>>n; v...

宁静以致墨的专栏 321

C++程序设计模板,向量和栈

C++程序设计模板 1. 模板基础 模板功能提供了在函数和类中将类型作为参数的能力,可以设计具有通用类型的函数和类,而编译 器可在编译时将通用类型确定为一种特定类型 //一个求最大值的通用模板 GenericType maxValue(GenericType value1,GenericType value2){ if(value1 > value2){ return value1 }else return value2; } # include <iostream> #

唐小厨的博客 339
上一篇: linux下socket 编程
下一篇: 主成分分析(Principal components analysis)-最大方差解释
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值