自定义一个vector向量类

C++标准模板库STL给出了vector,list,deque,stack,set,map等模板类,平时我们直接使用居多,对于类内部怎么实现不在意。现在以向量类vector为例,简单自定义:

其UML:

vetor<typename T>

-数组名ele:T

-数组目前大小size:int

-数组容量cap:int

+vector<T>();//用指定元素类型创建一个空向量

+sure():void//当增加元素增多至大于cap时候,自动扩充数组大小

+push_back(T VAL):void

+pop_back():void

+size1():int;

+at(int index):T

+empty():bool

+clear();void

+swap( v1:vector):void

//vector 
template<typename T>
class vector{
private:
  T *ele;
int size;
int cap;
public:
	vector<T>(){size=0;cap=16;ele=new T[cap];}//创建一个空向量
	void sure(){if(size>cap) {T*old=ele;
	cap=2*size;
	ele=new T[cap];
	for(int i=0;i<size;i++)
	  ele[i]=old[i];
	/*delete old;*/}
	}//当增加元素增多至大于cap时候,自动扩充数组大小,即实现按需增长
void push_back(T x);
void pop_back();
int size1();
T at(int index);
bool empty();
void clear();
void swap(vector<T> &v1);};
template<typename T>
void vector<T>::push_back(T x){
sure();
ele[size++]=x;}
template<typename T>
void vector<T>::pop_back(){
if(empty()) throw runtime_error("empty");
--size;}
template<typename T>
int vector<T>::size1(){
return size;}
template<typename T>
T vector<T>::at(int index){
if(empty()||index>cap) throw runtime_error("empty");
return ele[index];}
template<typename T>
bool vector<T>::empty(){
if(size==0) return true;
else return false;}
template<typename T>
void vector<T>::clear(){
	while(!empty()){
	pop_back();}
}
template<typename T>
void vector<T>::swap(vector<T> &v1){
	int len=v1.size1();
	if(len>=size){
		T *p=new T[len];
for(int i=0;i<size;i++)
{p[i]=ele[i];}
clear();
for(int i=0;i<len;i++)
	push_back(v1.at(i));
	v1.clear();
for(int i=0;i<len;i++)
{v1.push_back(p[i]);}}
	else{
	T *p=new T[size];
for(int i=0;i<size;i++)
{p[i]=ele[i];}
clear();
for(int i=0;i<len;i++)
{ele[i]=v1.at(i);}
v1.clear();
for(int i=0;i<size;i++)
{v1.push_back(p[i]);}
	}//交换不同长度的向量
}
调用:

int main(){
vector<int> vi;
for(int i=0;i<10;i++)
	vi.push_back(i);
for(int i=0;i<vi.size1();i++)
	cout<<vi.at(i)<<" ";
cout<<endl;//int类型vector
cout<<"访问第100个元素"<<endl;
try{cout<<vi.at(100);}
catch(runtime_error&e){
	cout<<e.what()<<endl;}
vector<string> vs;
	vs.push_back("\"beijing\"");
	vs.push_back("\"shanghai\"");
	vs.push_back("\"nanjing\"");

for(int i=0;i<vs.size1();i++)
	cout<<vs.at(i)<<" ";
cout<<endl;
//string类型vector
vector<string> vss;
	vss.push_back("beijing");
	vss.push_back("shanghai");
	vss.push_back("beijing");
	vss.push_back("shanghai");
	for(int i=0;i<vss.size1();i++)
	cout<<vss.at(i)<<" ";
cout<<endl;
	vs.swap(vss);//交换
	cout<<"after swap:"<<endl;
for(int i=0;i<vs.size1();i++)
	cout<<vs.at(i)<<" ";
cout<<endl;
for(int i=0;i<vss.size1();i++)
	cout<<vss.at(i)<<" ";
system("pause");
return 0;}


即实现了简单C++向量类自定义与实现。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python自定义可以用来模拟三维向量及其运算。我们可以定义一个Vector,其中包含三个属性x、y、z,分别表示向量在三个坐标轴上的分量。同时,我们还可以定义一些方法来实现向量的加减、点乘、叉乘等运算。 下面是一个简单的示例代码: ``` class Vector: def __init__(self, x, y, z): self.x = x self.y = y self.z = z def __add__(self, other): return Vector(self.x + other.x, self.y + other.y, self.z + other.z) def __sub__(self, other): return Vector(self.x - other.x, self.y - other.y, self.z - other.z) def dot(self, other): return self.x * other.x + self.y * other.y + self.z * other.z def cross(self, other): x = self.y * other.z - self.z * other.y y = self.z * other.x - self.x * other.z z = self.x * other.y - self.y * other.x return Vector(x, y, z) def __str__(self): return "({}, {}, {})".format(self.x, self.y, self.z) ``` 在这个示例中,我们定义了一个Vector,其中包含了三个属性x、y、z,以及一些方法来实现向量的加减、点乘、叉乘等运算。其中,__add__和__sub__方法分别用来实现向量的加法和减法,dot方法用来实现向量的点乘,cross方法用来实现向量的叉乘,__str__方法用来返回向量的字符串表示。 使用这个Vector,我们可以很方便地进行向量的运算。例如: ``` v1 = Vector(1, 2, 3) v2 = Vector(4, 5, 6) print(v1 + v2) # 输出 (5, 7, 9) print(v1 - v2) # 输出 (-3, -3, -3) print(v1.dot(v2)) # 输出 32 print(v1.cross(v2)) # 输出 (-3, 6, -3) ``` 这样,我们就可以用Python自定义来模拟三维向量及其运算了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值