vector简单实现

#include<iostream>
"https://github.com/fookwood/fkcode/network"
template<class Object>
class Vector{
private:
	int theSize; //元素的个数
	int theCapacity; //容量
	Object *objects; //指向new分配的资源
public:
	explicit Vector( int initSize = 0 ):
		theSize( initSize ),theCapacity( initSize + SPACE_CAPACITY ){
		objects = new Object[ theCapacity ];
	}//用explicit避免隐式类型转换
	Vector( const Vector & rhs ):objects( NULL ){
		operator=( rhs );
	}//copy constructor
	~Vector(){
		delete [] objects;
	}

	const Vector & operator= ( const Vector & rhs ){
		if( this != &rhs ){//如果是本身的话就不用再操作了
			delete [] objects;
			theSize = rhs.size();
			theCapacity = rhs.capacity();

			objects = new Object[ capacity() ];
			for( int k = 0; k < theSize; k++ )//拷贝元素 				 			objects[k] = rhs.objects[k]; 		 		} 		 		return *this; 	 	}// above,the "big three" 	 	void resize( int newSize ){ 		 		if( newSize > theCapacity )
			reserve( newSize*2 + 1 ); //
		theSize = newSize;
	}//每次空间不够的时候,就重新获得2倍于当前容量的空间,+1是为了防止0的情况

	void reserve( int newCapacity ){
		if( newCapacity < theSize ) return;

		Object *oldArray = objects;
		objects = new Object[ newCapacity ];
		for( int k = 0; k < theSize; k++ )
			objects[k] = oldArray[k];
		theCapacity = newCapacity;
		delete [] oldArray;
	}//获取新的空间,拷贝,释放旧的
//[]操作符,non-const和const版的..
	Object & operator[] ( int index ) { return objects[ index ]; }
	const Object & operator[] ( int index ) const { return objects[ index ]; }

	bool empty() const { return size() == 0; }
	int size() const { return theSize; }
	int capacity() const { return theCapacity; }

	void push_back( const Object & x ){
		if( theSize == theCapacity )
			reserve( 2*theCapacity + 1 );
		objects[ theSize++ ] = x;
	}//插入元素

	void pop_back() { theSize--; }
	const Object & back() const { return objects[ theSize-1 ]; }

	typedef Object * iterator;//用原生指针替代迭代器
	typedef const Object * const_iterator;

	iterator begin() { return &objects[0]; }
	const_iterator begin() const { return &objects[0]; }
	iterator end()	 { return &objects[ theSize ]; }
	const_iterator end()   const { return &objects[ theSize ]; }

	enum{ SPACE_CAPACITY = 4 };//初始容量
};

int main() {
//进行简单的测试
	Vector V;
	for( int i = 0; i < 100; i++ )
		V.push_back( i );

	for( Vector::iterator it = V.begin(); it != V.end(); it++ )
		std::cout << *it << std::endl;

	const Vector v( V );
	for( Vector::const_iterator it = V.begin();
			it != V.end(); it++ )
		std::cout << *it << std::endl;

	return 0;
}
http://www.fookwood.com/archives/455
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言中,没有内置的向量(vector型,但我们可以使用结构体和动态内存分配来实现似的功能。 首先,我们可以定义一个结构体来表示向量,该结构体包含一个指向元素的指针、向量的当前大小和容量。在创建向量时,需要指定容量,并为元素分配内存。 下面是一个简单的C语言向量的实现示例: ```C #include <stdio.h> #include <stdlib.h> typedef struct { int *elements; int size; int capacity; } Vector; // 初始化向量 void initVector(Vector *vector, int capacity) { vector->size = 0; vector->capacity = capacity; vector->elements = (int *)malloc(sizeof(int) * capacity); } // 向向量尾部添加元素 void pushBack(Vector *vector, int element) { // 如果向量已满,需要增加容量 if (vector->size == vector->capacity) { vector->capacity *= 2; vector->elements = (int *)realloc(vector->elements, sizeof(int) * vector->capacity); } vector->elements[vector->size++] = element; } // 获取向量中指定位置的元素 int getElement(Vector *vector, int index) { if (index < 0 || index >= vector->size) { printf("Invalid index!\n"); return -1; } return vector->elements[index]; } // 打印向量中的所有元素 void printVector(Vector *vector) { printf("Vector elements: "); for (int i = 0; i < vector->size; i++) { printf("%d ", vector->elements[i]); } printf("\n"); } // 释放向量内存 void freeVector(Vector *vector) { free(vector->elements); } int main() { Vector vector; initVector(&vector, 10); pushBack(&vector, 1); pushBack(&vector, 2); pushBack(&vector, 3); printVector(&vector); printf("Element at index 1: %d\n", getElement(&vector, 1)); freeVector(&vector); return 0; } ``` 上述示例中,我们定义了一个向量结构体`Vector`,并实现了向量的初始化、向尾部添加元素、获取指定位置元素、打印向量元素和释放向量内存等功能。 虽然C语言没有内置的向量型,但通过使用结构体和动态内存分配,我们可以实现自己的向量功能。以上是一个简单的C语言向量实现示例,可以根据具体需求进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值