Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17374
  • 博文数量: 22
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-27 15:19
文章分类

全部博文(22)

文章存档

2010年(22)

我的朋友
最近访客

分类: C/C++

2010-03-27 17:04:51

在顺序读取文件缓存大量数据时候,STL标准库中的std::vector类模板,由于其内存扩展方式,往往当容量不足时,需要先申请两倍于目前的空间,然后将现在的数据拷贝过去,这样速度很慢。
在这里我写了一个小类模板tvector,用数据块来进行扩展,类在初始化的时候,用户指定初始化大小,以及每次增长的容量大小。详细代码如下:
 

#ifndef T_VECTOR_H
#define T_VECTOR_H
/*
** 这个类适合存储大量数据,并支持随机访问
*/

#include <cassert>
#include <vector>
template<class T> class tvector
{
public:
 typedef unsigned int size_type;
public:
 tvector(size_type initSize = 1000, size_type increaseSize = 1000);
 virtual ~tvector(void);
 void push_back(const T &data);
 T& operator[] (size_type index);
 const T& operator[] (size_type index) const;
 size_type size() const { return m_dataSize; }
private:
 std::vector<T*> m_dataBlocks;
 size_type m_initSize;
 size_type m_increaseSize;
 size_type m_capacity;
 size_type m_dataSize;
 size_type m_currentBlockID;
 size_type m_nextDataID;
};
template<class T> tvector<T>::tvector(size_type initSize, size_type increaseSize)
{
 m_initSize = initSize;
 m_increaseSize = increaseSize;
 T *firstBlock = new T[m_initSize];
 assert(firstBlock != NULL);
 memset(firstBlock, sizeof(T) * initSize, 0);
 m_dataBlocks.push_back(firstBlock);
 m_capacity = m_initSize;
 m_dataSize = 0;
 m_currentBlockID = 0;
 m_nextDataID = 0;
}
template<class T> tvector<T>::~tvector()
{
 for(std::vector<T*>::iterator it = m_dataBlocks.begin(); it != m_dataBlocks.end(); it++)
 {
  delete[] *it;
 }
}
template<class T> void tvector<T>::push_back(const T &data)
{
 if(m_capacity)
 {
  m_dataBlocks[m_currentBlockID][m_nextDataID++] = data;
  m_capacity--;
 }
 else
 {
  T *block = new T[m_increaseSize];
  assert(block != NULL);
  memset(block, sizeof(T) * m_increaseSize, 0);
  block[0] = data;
  m_dataBlocks.push_back(block);
  m_currentBlockID++;
  m_nextDataID = 1;
  m_capacity = m_increaseSize - 1;
 }
 m_dataSize++;
}
template<class T> T& tvector<T>::operator[](size_type index)
{
 if(index < m_initSize) return m_dataBlocks[0][index];
 else
 {
  size_type blockID = (index - m_initSize) / m_increaseSize + 1;
  size_type dataID = (index - m_initSize) % m_increaseSize;
  return m_dataBlocks[blockID][dataID];
 }
}
template<class T> const T& tvector<T>::operator[](size_type index) const
{
 if(index < m_initSize) return m_dataBlocks[0][index];
 else
 {
  size_type blockID = (index - m_initSize) / m_increaseSize + 1;
  size_type dataID = (index - m_initSize) % m_increaseSize;
  return m_dataBlocks[blockID][dataID];
 }
}
#endif


阅读(202) | 评论(0) | 转发(0) |
0

上一篇:数据库读书笔记

下一篇:CHAR[]与CHAR*

给主人留下些什么吧!~~