#include <iostream>
using namespace std;

template <class V>
class Vector {

	int tamano;
	V *valores;

public:
	//Constructores
	Vector();
	Vector(const Vector&);
	Vector(const int, const V *);
	//Destructor
	~Vector();

	//Métodos de acceso
	V obtenerElemento(const int);
	int obtenerTamano();
	void mostrarVector();

	//Métodos de modificación
	void asignarElemento(const int, const V);
	void inicializarVector(const int);

	//Sobrecarga de operadores
	Vector operator+(Vector);
	bool operator==(Vector);
};


//Constructores
template <class V>
Vector<V>::Vector(){
	tamano = 0;
}
template <class V>
Vector<V>::Vector(const Vector& vec){
	int i,j;
	tamano = vec.tamano;
	valores = new V[tamano];
	for(i=0; i<tamano; i++){
		if(vec.tamano > i){
			valores[i] = vec.valores[i];
		}
	}
}
template <class V>
Vector<V>::Vector(const int t, const V *vals){
	int i;
	tamano = t;
	valores = new V[t];
	for(i=0; i<t; i++){
		valores[i] = vals[i];
	}
}

//Destructor
template <class V>
Vector<V>::~Vector(){
	delete valores;
}

//Métodos de acceso
template <class V>
V Vector<V>::obtenerElemento(const int i){
	return this->valores[i];
}

template <class V>
int Vector<V>::obtenerTamano(){
	return tamano;
}

template <class V>
void Vector<V>::mostrarVector(){
	int i;
	for(i=0; i<tamano; i++){
		cout<<valores[i]<<endl;
	}
}

//Métodos de modificación
template <class V>
void Vector<V>::asignarElemento(const int i, const V val){
	valores[i] = val;
}
template <class V>
void Vector<V>::inicializarVector(const int tam){
	int i;
	if(tamano != 0){
		tamano = tam;
		valores = new V[tam];
	}
	for(i=0; i<tamano; i++)
		valores[i] = 0;
}


//Sobrecarga de operadores

/*
template <class V> Vector Vector<V>::operator+(Vector v){
	int i;
	if(v.tamano == this->tamano){
		Vector <V> vr(v); 
		for(i=0; i<v.tamano; i++){
			vr.valores[i] = v.valores[i] +
					this->valores[i];
		}
		return vr;
	}
	else{
		if(this->tamano < v.tamano){
			VectorEnteros vr(v);
			for(i=0; i<this->tamano; i++){
			    vr.valores[i] = this->valores[i] +
						v.valores[i];
			}
			return vr;
		}
		else{
			VectorEnteros vr(*this);
			for(i=0; i<v.tamano; i++){
			    vr.valores[i] = this->valores[i] +
						v.valores[i];
			}
			return vr;
		}
	}
}
*/

template <class V> bool Vector<V>::operator==(Vector v){
	int i;
	if(tamano != v.tamano){
		return false;
	}
	else{
		for(i=0; i<tamano; i++){
			if(this->valores[i] != v.valores[i])
				return false;
		}
		return true;
	}
}

