Re[3]: Multidimensional Arrays in MFC
От: Кодт Россия  
Дата: 23.09.02 13:31
Оценка: 15 (2)
Здравствуйте Harut, Вы писали:

H>Спосибо Игорь, Но дело в том. что я не знаю размер массива. я хочу знать есть возможность использовать классы MFC как например CArray для динамического развивание массива?


Есть несколько путей:
1) линеаризация многомерного массива:
template<class TYPE, class ARGTYPE = TYPE>
class CThreeDimArray
{
protected:
  size_t m_xSize, m_ySize, m_zSize; // размеры
  typedef CArray<TYPE, ARGTYPE> array_t;
  array_t m_array;

  // линеаризация
  size_t Index(size_t x, size_t y, size_t z) const
  {
    ASSERT(x < m_xSize && y < m_ySize && z < m_zSize);
    return x + y * m_xSize + z * m_xSize * m_ySize;
  }

public:
  size_t GetXSize() const { return m_xSize; }
  size_t GetYSize() const { return m_ySize; }
  size_t GetZSize() const { return m_zSize; }

  void SetSize(size_t x, size_t y, size_t z)
  {
    m_xSize = x; m_ySize = y; m_zSize = z;
    m_array.SetSize(0); // стираем исходные данные
    m_array.SetSize(x * y * z); // выставляем размер
  }

  TYPE GetAt(int x, int y, int z) const { return m_array.GetAt(Index(x, y, z)); }
  void SetAt(int x, int y, int z, ARGTYPE v) { m_array.SetAt(Index(x, y, z), v); }
};


2) массивы массивов
(будет затруднительно прописывать размеры второго-третьего измерений)

3) разреженные массивы
struct INDEX
{
  int x, y, z;

  INDEX() {}
  INDEX(size_t _x, _y, _z): x(_x), y(_y), z(_z) {}
  INDEX(const INDEX& i): x(i.x), y(i.y), z(i.z) {}

};

operator < (const INDEX& a, const INDEX& b)
{
  return a.x <  b.x ||
         a.x == b.x && (a.y <  b.y ||
                        a.y == b.y && (a.z < b.z)
                       );
}

template<>
BOOL AFXAPI CompareElements(const INDEX* pa, const INDEX* pb)
{
  return (*a) < (*b);
}

template <class TYPE, class ARGTYPE = TYPE>
class CThreeDimArray
{
protected:
  typedef CMap<INDEX, INDEX&, TYPE, ARGTYPE> map_t;
  map_t m_map;
  TYPE m_defvalue;
public:
  // смена значения по ходу работы может привести к интересным последствиям :)
  TYPE GetDefValue() const { return m_defvalue; }
  void SetDefValue(ARGTYPE v) { m_defvalue = v; }

  TYPE GetAt(const INDEX& i) const
  {
    TYPE v;
    if(m_map.Lookup(i, v))
      return v;
    else
      return m_defvalue;
  }
  TYPE SetAt(const INDEX& i, ARGTYPE v, BOOL bStoreDefault = false)
  {

    // лишнего не хранить
    if(!bStoreDefault && m_defvalue == v)
      m_map.RemoveAt(i);
    else

      m_map.SetAt(i, v);
  }
};
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.