疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

一个仿Java类封装的std:list封装类


 

   最近,顶目需要用到C++,研究了std几天。发现std::list提供的功能与Java的ArrayList类似,但编程使用上却有很大差异,感到很不习惯,于是写了个std::list封装类。

  ArrayList.h

  [cpp]

  /************************************************************************/

  /* ArrayList

  */

  /* 一个仿Java类封装的std::list封装类(头文件包含函数实现体)

  */

  /* author:Sinmax, date:2013-02-25

  */

  /************************************************************************/

  #ifndef _ARRAY_LIST_H_

  #define _ARRAY_LIST_H_

  #include

  using namespace std;

  template

  class ArrayList

  {

  public:

  typedef typename std::list::iterator ArrayListIterator;

  ArrayList()

  : m_list(0)

  {

  m_list = new std::list();

  };

  ~ArrayList()

  {

  m_list->clear();

  delete m_list;

  };

  //添加一个元素(到末端)

  void add(T t)

  {

  m_list->push_back(t);

  }

  //添加一个元素:在指定索引,指定索引大于列表长度,则添加到末端

  void add(T t, int index )

  {

  if( index < 0 )

  {

  //ignore , not recommand m_list->push_front(t);

  }

  else if( index == 0 )

  {

  m_list->push_front(t);

  }

  else if( index < count() - 1 )

  {

  ArrayListIterator it = m_list->begin();

  int n = 0;

  while( n < index )

  {

  ++it;

  ++n;

  }

  m_list->insert(it, t);

  }

  else

  {

  m_list->push_back(t);

  }

  }

  //获取指定索引的元素

  T get(int index)

  {

  int length = count();

  if( index == 0 )

  {

  return m_list->front();

  }

  else if( index < length - 1 )

  {

  int n = 0;

  ArrayListIterator it = m_list->begin();

  while ( ++n <= index )

  {

  ++it;

  }

  return *it;

  }

  else if( index == length - 1 )

  {

  return m_list->back();

  }

  return NULL;

  }

  //删除指定的元素(第一个找到)

  void remove(T t)

  {

  ArrayListIterator it = indexOfIt(t);

  if( it != m_list->end() )

  {

  m_list->erase(it);

  }

  }

  //删除指定的元素(所有找到)

  void removeEx(T t)

  {

  m_list->remove(t);

  }

  //删除指定索引的元素,并返回该索引的元素

  T removeAt(int index)

  {

  if( index < 0 )

  {

  //ignore

  return NULL;

  }

  int length = count();

  T t = NULL;

  if ( index >= length )

  {

  return NULL;

  }

  else if ( index == 0 )

  {

  t = m_list->front();

  m_list->pop_front();

  return t;

  }

  else if( index == length - 1 )

  {

  t = m_list->front();

  m_list->pop_front();

  return t;

  }

  else if( index < length )

  {

  ArrayListIterator it = m_list->begin();

  while( --length > 0 )

  {

  ++it;

  }

  t = *it;

  m_list->erase(it);

  return t;

  }

  return NULL;

  }

  //删除所有元素

  void removeAll()

  {

  m_list->clear();

  }

  //查找等于t元素的迭代器

  const ArrayListIterator indexOfIt(T t)

  {

  ArrayListIterator it = m_list->begin();

  while( it != m_list->end() )

  {

  if( t == *it )

  return it;

  else

  ++it;

  }

  return m_list->end();

  }

  //查找t在列表中的索引

  int indexOf(T t)

  {

  ArrayListIterator it = m_list->begin();

  int index = 0;

  while( it != m_list->end() )

  {

  if( t == *it )

  return index;

  ++it ;

  ++index;

  }

  return -1;

  }

  //从末端起 查找t在列表中的索引

  int lastIndexOf(T t)

  {

  ArrayListIterator it = m_list->end();

  int index = count();

  do

  {

  --it;

  --index;

  if( t == *it )

  return index;

  } while ( it != m_list->begin() ) ;

  return -1;

  }

  //把列表导出为数组

  T* toArray(T* array = NULL)

  {

  int cnt = count();

  if( cnt == 0 )

  return NULL;

  if( array == NULL)

  array = new T[cnt];

  int index = 0;

  ArrayListIterator it = m_list->begin();

  while ( it != m_list->end() )

  {

  array[index] = *it;

  ++index;

  ++it;

  }

  return array;

  }

  //从数组里导到n个元素

  void fromArray(T* array, int n)

  {

  for(int i=0;i

  {

  add(array[i]);

  }

  }

  void sort( /* _Pr3 _Pred */ )

  {

  //未实现

  }

  //返回容器元素总个数

  int count()

  {

  if( m_list->empty() )

  return 0;

  return m_list->size();

  }

  //复制一份当前实例的副本

  ArrayList* clone()

  {

  //m_list->insert( … )

  ArrayList* array = new ArrayList();

  T* elements = this->toArray();

  int cnt = this->count();

  array->fromArray(elements, cnt);

  delete elements;

  return array;

  }

  //获取m_list实例,由外部程序直接操作

  std::list* getStdList()

  {

  return m_list;

  }

  private:

  //unsigned int overflow

  std::list* m_list;

  };

  #endif

  Test01.cpp (VS2010下编译通过)

  [cpp]

  #include "stdafx.h"

  #include "ArrayList.h"

  int _tmain(int argc, _TCHAR* argv[])

  {

  ArrayList* array = new ArrayList();

  for(int i=0;i<10;i++)

  {

  array->add( i );

  }

  array->add(2, 2);

  array->addAt(100, 10000);

  printf("indexOf(2)=%d ", array->indexOf(2));

  printf("lastIndexOf(2)=%d ", array->lastIndexOf(2));

  //array->removeEx(2);

  //array->removeAll();

  ArrayList* array2 = array->clone();

  for( int i=0;icount();i++)

  {

  printf("get(%d)=%d ", i, array->get(i));

  }

  getchar();

  return 0;

  }