文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>改进vector

改进vector

时间:2010-03-27  来源:qytan36

在顺序读取文件缓存大量数据时候,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


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载