Re: Кому не лень ковыряться в чужом коде
От: Al-Ko  
Дата: 18.07.02 09:53
Оценка:
Здравствуйте Idler, Вы писали:
....
SKIPPED

Для таких случаев сделал небольшую резекцию MFC-шному CArray:


template<class TYPE>
class AKVector 
{
public:
    AKVector(long numElements);
    AKVector();
    virtual ~AKVector();
    long GetSize() const;
    void Insert(long nIndex, long nCount = 1);
    void Append(long nCount = 1);
    void Remove(long nIndex, long nCount = 1);
    TYPE& operator[](long nIndex);
private:
    TYPE* m_pData;   // the actual array of data
    long m_nSize;     // # of elements 

};


template<class TYPE>
inline long AKVector<TYPE>::GetSize() const
    { return m_nSize; }


template<class TYPE>
inline TYPE& AKVector<TYPE>::operator[](long nIndex)
    { return m_pData[nIndex]; }



template<class TYPE>
AKVector<TYPE>::AKVector(long numElements )
    {
        m_pData = NULL;
        m_nSize = 0;
    
        Append(numElements);
        return;

    }
template<class TYPE>
AKVector<TYPE>::AKVector()
    {
        m_pData = NULL;
        m_nSize = 0;
        return;

    }

template<class TYPE>
AKVector<TYPE>::~AKVector()
    {
        delete [] m_pData;
        m_nSize = 0;
        return;

    }


template<class TYPE>
void AKVector<TYPE>::Insert(long nIndex, long nCount /* = 1 */)
    {
        ATLASSERT(nIndex < m_nSize);
    
        long nNewSize = m_nSize + nCount;
        TYPE* pNewData =  new TYPE[nNewSize];

        if(nIndex > 0)
            memmove(pNewData, m_pData, nIndex * sizeof(TYPE));

        memmove(&pNewData[nIndex + nCount], &m_pData[nIndex], (m_nSize-nIndex)* sizeof(TYPE));
        
        delete [] m_pData;

        m_nSize = nNewSize;
        m_pData = pNewData;

    }

template<class TYPE>
void AKVector<TYPE>::Append(long nCount /* = 1 */)
    {
        long nNewSize = m_nSize + nCount;
        
        TYPE* pNewData =  new TYPE[nNewSize];

        if(m_nSize > 0){
            memmove(pNewData, m_pData, m_nSize * sizeof(TYPE));
            delete [] m_pData;
        }

        m_nSize = nNewSize;

        m_pData = pNewData;

    }


template<class TYPE>
void AKVector<TYPE>::Remove(long nIndex, long nCount /* = 1 */)
    {
        ATLASSERT(nIndex >= 0);
        ATLASSERT(nCount >= 0);
    
        ATLASSERT(nIndex + nCount <= m_nSize);
    
        long nNewSize = m_nSize - nCount;

        TYPE* pNewData;

        if(nNewSize > 0)
            pNewData =  new TYPE[nNewSize];
        else
            pNewData = NULL;

        if(nIndex > 0)
            memmove(pNewData, m_pData, nIndex * sizeof(TYPE));

        if(nIndex < nNewSize)
            memmove(&pNewData[nIndex ], &m_pData[nIndex + nCount], (m_nSize-nIndex-nCount)* sizeof(TYPE));

        delete [] m_pData;

        m_nSize = nNewSize;
        m_pData = pNewData;

    }



получился облегченный динамический Array. С его помощью, кстати, можно делать и двумерные массивы:


    typedef AKVector <TCHAR*> vecClipRows;
    AKVector <vecClipRows> ClipArray;
        ClipArray.Append(NUMROWS);
        for (int i = 0; i< NUMROWS;i++){
              ClipArray[i].Append(NUMCOLS);
              for(int j = 0; j<NUMCOLS;j++){
                    ClipArray[i][j] = new TCHAR [nTextLen];
              }
        }


причем количество столбцов в каждой строке может быть разным.

перед выходом из области видимости ClipArray нужно удалить все элементы (delete ClipArray [i][j] в цикле)
Старый глюк лучше новых двух!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.