C/C++ 语言兼容的动态数组

CSDN不厚道,竟然把我粘贴的代码改了,本来代码里面是是\,都改成了/,

 

/************************************************************************/
/*   filename : vect.h                                                  */
/*   author : lichiyang#eyou.com                                        */
/*   description : C/C++  compatible dynamic vector                     */
/*   version : 1.0                                                      */
/*   date : 2011.4.2                                                    */
/************************************************************************/


#ifndef __C_VECTOR_H__
#define __C_VECTOR_H__

#define DECLARE_VECTOR(type) /
struct _Vec##type /
{/
	void (*pInit)(struct _Vec##type *, int);/
	type * (*pAlloc)(int);/
	void (*pFree)(type *);/
	int (*pAdd)(struct _Vec##type *, type);/
	int (*pDel)(struct _Vec##type *, int);/
	int (*pDelAll)(struct _Vec##type *, type);/
	int (*pHas)(struct _Vec##type *, type);/
	int (*pEnsureCap)(struct _Vec##type *, int);/
	int nCount;/
	int nCaption;/
	type * pData;/
};/
typedef struct _Vec##type VECTOR_##type, *PVECTOR_##type

#define IMPLEMENT_VECTOR(type) /
type * _Vec##type##Alloc(int n)/
{/
	return (type *)malloc(n * sizeof(type));/
}/
void _Vec##type##Free(type * p)/
{/
	free((void *)p);/
}/
int _Vec##type##EnsureCap(struct _Vec##type * pVec, int cap)/
{/
	if(cap > pVec->nCaption)/
	{/
		int i;/
		type *pNewData = 0;/
		int newCap = pVec->nCaption * 2;/
		if (newCap == 0)/
			newCap = 8;/
		while(newCap < cap)/
			newCap *= 2;/
		pNewData = pVec->pAlloc(newCap);/
		if (pNewData == 0) return 0;/
		for (i=0; i<pVec->nCount; i++)/
			pNewData[i] = pVec->pData[i];/
		pVec->pFree(pVec->pData);/
		pVec->pData = pNewData;/
		pVec->nCaption = newCap;/
	}/
	return 1;/
}/
int _Vec##type##Add(struct _Vec##type * pVec, type e)/
{/
	if(!pVec->pEnsureCap(pVec, pVec->nCount + 1)) return 0;/
	pVec->pData[pVec->nCount ++] = e;/
	return 1;/
}/
int _Vec##type##Del(struct _Vec##type * pVec, int nIndex)/
{/
	int i;/
	int nCount;/
	if (nIndex >= pVec->nCount)/
		return 0;/
	pVec->nCount--;/
	nCount = pVec->nCount;/
	for (i=nIndex; i<nCount; i++)/
		pVec->pData[i] = pVec->pData[i+1];/
	return 1;/
}/
/
int _Vec##type##DelAll(struct _Vec##type * pVec, type e)/
{/
	int skip;/
	int i;/
	type * p = pVec->pData;/
	int pos = -1;/
	int nCount = pVec->nCount;/
	for	(i=0; i<nCount; i++)/
		if (*p++ == e)/
		{/
			pos = i;/
			break;/
		}/
	if (pos == -1) return 0;/
	skip = 1;/
	while (pos+skip < nCount)/
	{/
		if (pVec->pData[pos+skip] == e)/
		{/
			skip ++;/
			continue;/
		}/
		pVec->pData[pos] = pVec->pData[pos+skip];/
		pos ++;/
	}/
	pVec->nCount -= skip;/
	return 1;/
}/
/
int _Vec##type##Has(struct _Vec##type * pVec, type e)/
{/
	type * p = pVec->pData;/
	int nCount = pVec->nCount;/
	int i;/
	for (i=0; i<nCount; i++)/
		if (*p++ == e)/
			return 1;/
	return 0;/
}/
void _Vec##type##Init(struct _Vec##type * pVec, int caption)/
{/
	pVec->nCount = 0;/
	pVec->nCaption = caption;/
	pVec->pAlloc = _Vec##type##Alloc;/
	pVec->pFree = _Vec##type##Free;/
	pVec->pAdd = _Vec##type##Add;/
	pVec->pDel = _Vec##type##Del;/
	pVec->pDelAll = _Vec##type##DelAll;/
	pVec->pHas = _Vec##type##Has;/
	pVec->pEnsureCap = _Vec##type##EnsureCap;/
	pVec->pData = _Vec##type##Alloc(caption);/
}


#define VECTOR_DEFINE(type, vec) VECTOR_##type vec={_Vec##type##Init}
#define VECTOR_TYPE(type) VECTOR_##type
#define VECTOR_INIT_EX(pVec, caption) (pVec)->pInit((pVec), (caption))
#define VECTOR_INIT(pVec) VECTOR_INIT_EX((pVec), 8)
#define VECTOR_CLEAR(pVec) (pVec)->pFree((pVec)->pData); (pVec)->pData = 0; (pVec)->nCount = (pVec)->nCaption = 0
#define VECTOR_ITEM(pVec, index) (pVec)->nCount > (index) ? (pVec)->pData + (index) : 0
#define VECTOR_COUNT(pVec) ((pVec)->nCount)
#define VECTOR_ADD(pVec, element) (pVec)->pAdd((pVec), (element))
#define VECTOR_DEL(pVec, index) (pVec)->pDel((pVec), (index))
#define VECTOR_DEL_ALL(pVec, element) (pVec)->pDelAll((pVec), (element))
#define VECTOR_HAS(pVec, element) (pVec)->pHas((pVec), (element))
#define VECTOR_ENSURE_CAP(pVec, caption) (pVec)->pEnsureCap((pVec), (caption))

/************************************************************************/
/* sample

#include <stdlib.h>
#include <stdio.h>
#include "vect.h"

DECLARE_VECTOR(int);		//定义int类型的VECTOR
IMPLEMENT_VECTOR(int);		//实现int类型的VECTOR

void PrintVector(VECTOR_TYPE(int) * pVec);

int main(int argc, char* argv[])
{
	VECTOR_DEFINE(int, v);
	VECTOR_INIT(&v);		//初始化
	VECTOR_ADD(&v, 1);		//在末尾追加元素
	VECTOR_ADD(&v, 2);
	VECTOR_ADD(&v, 5);
	VECTOR_ADD(&v, 6);
	VECTOR_ADD(&v, 6);
	VECTOR_ADD(&v, 2);
	VECTOR_ADD(&v, 5);
	VECTOR_ADD(&v, 6);
	VECTOR_ADD(&v, 6);
	VECTOR_ADD(&v, 2);
	VECTOR_ADD(&v, 5);
	VECTOR_ADD(&v, 6);
	VECTOR_ADD(&v, 6);

	PrintVector(&v);

	VECTOR_DEL(&v, 1);		//删除索引为1的元素
	VECTOR_DEL_ALL(&v, 6);	//删除所有值为6的元素

	printf("%s值为5的元素。/r/n", VECTOR_HAS(&v, 5) ? "包含" : "不包含");
	printf("%s值为6的元素。/r/n", VECTOR_HAS(&v, 6) ? "包含" : "不包含");

	VECTOR_CLEAR(&v);	//清理资源

	return 0;
}


void PrintVector(VECTOR_TYPE(int) * pVec)
{
	int i;
	for (i=0; i<VECTOR_COUNT(pVec); i++)
	{
		int *p = VECTOR_ITEM(pVec, i);
		printf("%d ", *p);
	}
	printf("/r/n");
}
*/
/************************************************************************/

#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值