Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2098598
  • 博文数量: 414
  • 博客积分: 10312
  • 博客等级: 上将
  • 技术积分: 4921
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-31 01:49
文章分类

全部博文(414)

文章存档

2011年(1)

2010年(29)

2009年(82)

2008年(301)

2007年(1)

分类: C/C++

2008-05-13 04:40:45

比如我们要取系统的日志信息,如果先获取到日志个数然后再分配空间的话,时间会比较长,影响效率。如果使用Vector动态添加的话,问题就解决了。在这个例子里,自定义了一个类,在类中使用双重的Vector来保存信息。


/*----------------------------------------------------------------
// Copyright (C) 2004 浪潮(北京)电子信息有限公司
// 版权所有。
//
// 文件名:bufArrayList.h
// 文件功能描述:这个类用来保存从动态连接库中显示的信息,采用了多层Vector的形式。
// 先保存每一个实例的属性和值到一个Vector中,然后在保存其实例到另外
// 一个Vector列表中。
//
// 作者:刘正伟
// 创建标识:2005/8/24
//
//----------------------------------------------------------------*/
#pragma once

#include

#ifndef BUFFARRAYDLL

#define BUFFARRAYDLLEXTEN __declspec(dllimport)
#else
#define BUFFARRAYDLLEXTEN __declspec(dllexport)
#endif


using namespace std ;

//coputerInfo
typedef struct BUFFARRAYDLLEXTEN _PerportyVauleMAP //Win32_ComputerSystem
{
//属性名称
char key[256] ;
//属性名称对应的值
char vaule[256];
}PerportyVauleMAP;


//定义一个Vector用来保存每一个实例的所有属性信息,里面保存的是一个个PerportyVauleMAP结构数组
typedef vector INSTANCEVECTOR;
//定义了一个Vector用来保存所有的实例列表,里面保存的是INSTANCEVECTOR类型
typedef vector INSTANCELISTVECTOR;

class BUFFARRAYDLLEXTEN CBufArrayList
{
public:
CBufArrayList(void);
~CBufArrayList(void);
private:
//STRINFGVECTOR strParamName;
INSTANCELISTVECTOR _instanceListVt;
//set the property's value to the vector

public:

/*
* 函数介绍 : 添加一个实例的某一个属性名称和属性值;
* 输入参数 : int vtLocation,Vector 的索引号,string name 属性名称, string value, 要赋予的值;
* 输出参数 : null;
* 返回值 : INSTANCEVECTOR类型, 返回加入之后保存实例的Vector.SetPerportyAndVaule
*/
void SetPerportyAndVaule(int vtLocation,char* name,char* value);
/*
* 函数介绍 : 将一个实例添加到实例列表中;
* 输入参数 : int& vtLocation
* 输出参数 : vtLocation;
* 返回值 : void.AddNewInstance
*/
void AddNewInstance(int& vtLocation);
/*
* 函数介绍 : 清除一个实例列表中保存的属性和值信息
* 输入参数 : null;
* 输出参数 : null;
* 返回值 : void.
*/
void ClearAll();
/*
* 函数介绍 : 根据实例和属性的位置,枚举出属性的名称和值
* 输入参数 : int instanceNumber,实例所在的位置int propertyNumber,属性所在的位置,PerportyVauleMAP &hash;属性结构
* 输出参数 : PerportyVauleMAP;
* 返回值 : bool 是否成功.
*/
bool GetPropertyValue(int instanceNumber,int propertyNumber,PerportyVauleMAP &hash);
/*
* 函数介绍 : 返回实例个数
* 输入参数 : null;
* 输出参数 : null;
* 返回值 : 实例个数
*/
int GetInstanceListSize();
/*
* 函数介绍 : 返回属性个数
* 输入参数 : null;
* 输出参数 : null;
* 返回值 : 属性个数
*/
int GetPropertySize();

};



CPP文件:

#include "StdAfx.h"

#define BUFFARRAYDLL

#include ".\bufarraylist.h"
CBufArrayList::CBufArrayList(void)
{

}

CBufArrayList::~CBufArrayList(void)
{
_instanceListVt.clear();
}

/*
* 函数介绍 : 添加一个实例的某一个属性名称和属性值;
* 输入参数 : string name 属性名称, string value, 要赋予的值;
* 输出参数 : null;
* 返回值 : INSTANCEVECTOR类型, 返回加入之后保存实例的Vector.
*/
void CBufArrayList::SetPerportyAndVaule(int vtLocation,char* name,char* value)
{
PerportyVauleMAP pmap ;
strcpy(pmap.key,name);
strcpy(pmap.vaule, value);
(_instanceListVt[vtLocation]).push_back(pmap);

}
/*
* 函数介绍 : 将一个实例添加到实例列表中;
* 输入参数 : INSTANCEVECTOR vt 保存一个实例信息的Vector;
* 输出参数 : null;
* 返回值 : void.
*/
void CBufArrayList::AddNewInstance(int& vtLocation)
{
INSTANCEVECTOR vt;
_instanceListVt.push_back(vt);
vtLocation = _instanceListVt.size() -1;
}


/*
* 函数介绍 : 清除一个实例列表中保存的所有实例信息,也清除实例Vector信息
* 输入参数 : null;
* 输出参数 : null;
* 返回值 : void.
*/
void CBufArrayList::ClearAll()
{
_instanceListVt.clear();
}
/*
* 函数介绍 : 返回属性个数
* 输入参数 : null;
* 输出参数 : null;
* 返回值 : 属性个数
*/
int CBufArrayList::GetPropertySize()
{
if (!_instanceListVt.empty())
{

INSTANCEVECTOR vt = (INSTANCEVECTOR) _instanceListVt[0];
if (vt.empty())
{
return 0;
}
else
{
return vt.size();
}
}
else
{
return 0;
}
}
/*
* 函数介绍 : 返回实例个数
* 输入参数 : null;
* 输出参数 : null;
* 返回值 : 实例个数
*/
int CBufArrayList::GetInstanceListSize()
{
int count = 0;
if (_instanceListVt.empty())
{
return 0;
}
else
{
count = _instanceListVt.size();
return count;
}
}
/*
* 函数介绍 : 根据实例和属性的位置,枚举出属性的名称和值
* 输入参数 : int instanceNumber,实例所在的位置int propertyNumber,属性所在的位置,PerportyVauleMAP &hash;属性结构
* 输出参数 : PerportyVauleMAP;
* 返回值 : bool 是否成功.
*/
bool CBufArrayList::GetPropertyValue(int instanceNumber,int propertyNumber,PerportyVauleMAP &hash)
{
if (!_instanceListVt.empty())
{

INSTANCEVECTOR vt = (INSTANCEVECTOR) _instanceListVt[instanceNumber];
if (vt.empty())
{
return false;
}
else
{
PerportyVauleMAP p = (PerportyVauleMAP)vt[propertyNumber];
strcpy(hash.key , p.key);
strcpy(hash.vaule, p.vaule);
}
}
else
{
return false;
}

return true;
}




使用:

#include "stdafx.h"
#include "BufArrayList.h"
int _tmain(int argc, _TCHAR* argv[])
{
CBufArrayList buf;
int index = 0;
for(int i=0;i<20000;i++)
{
buf.AddNewInstance(index);
printf("index:%d",index);
buf.SetPerportyAndVaule(index,"name","sundy");
buf.SetPerportyAndVaule(index,"age","123");
}

getchar();
return 0;
}



阅读(2073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~