0

独自のバージョンの C++ STL ベクトルを作成しようとしています<> 動的に拡大縮小するリストを作成したい...push_back、push_front、pop_back、pop_front、remove、removeAt、clear、およびサイズ...私はほとんど問題なくこれらすべてを書き、ビルドエラーや警告を受けていません.クラスをインスタンス化しようとすると、Eclipseはトークンの後にディメンションを探していることを教えてくれます.たとえば、そのタイプの配列になる...

    DynaArray<int> Bob;

ここでは、int の後に [] 演算子が必要です。

これが私のクラスが現在どのように見えるかです

    public class DynaArray<T>
{       
    int Size = 0;
    int CurrentCount = 0;
    int LastSpot = 0;
    T[] Array;

    DynaArray(int _size)
    {
        Size = _size;
    }

    @SuppressWarnings("unchecked")
    void push_back(T _element)
    {
        CurrentCount++;
        if(CurrentCount > Size)
        {
            //make a new array for double the size;
            if( Size == 0 )
            {
                Size = 2;
                Array = (T[]) new Object[Size];
            }
            else
            {
                int OldSize = Size;
                Size = Size*2;
                T[] TempArray;
                TempArray = (T[]) new Object[Size];
                int i = 0;
                for( ; i < OldSize; i++ )
                {
                    //Copy over info from Array to TempArray
                    TempArray[i] = Array[i];
                }
                Array = TempArray;
            }
        }

        //Now add the new element onto the array
        Array[LastSpot] = _element;
        LastSpot++;     

    }

    @SuppressWarnings("unchecked")
    void push_front(T _element)
    {
        CurrentCount++;
        if( Size == 0)
        {
            Size = 2;
            Array = (T[]) new Object[Size];
            Array[0] = _element;
            return;
        }
        else
        {
            int OldSize = Size;
            Size = Size+1;
            T[] TempArray;
            TempArray = (T[]) new Object[Size];
            int i = 1;
            for( ; i < OldSize; i++ )
            {
                //Copy over info from Array to TempArray
                TempArray[i] = Array[i-1];              
                Array = TempArray;
                Array[0] = _element;
            }           
    }

    }

    T pop_back()
    {
        if( CurrentCount <= 0)
            return null;
        else
        {
            return Array[CurrentCount-1];
        }

    }

    T pop_front()
    {
        if( CurrentCount <= 0)
            return null;
        else
        {
            return Array[0];
        }
    }

    int size()
    {
        return CurrentCount;
    }

    @SuppressWarnings("unchecked")
    void clear()
    {
        Size = 0;
        CurrentCount = 0;
        LastSpot = 0;
        Array = (T[]) new Object[2];

    }

    @SuppressWarnings("unchecked")
    void removeAt(int index)
    {
        T[] TempArray = (T[]) new Object[Size];
        int ArrayIndex = 0;
        for( int i = 0; i < CurrentCount; i++)
        {
            if( i == index )
                continue;

            TempArray[ArrayIndex] = Array[i];
            ArrayIndex++;

        }
    }

    void remove(T _element)
    {
        for(int i = 0; i < CurrentCount; i++)
        {
            //look for the element
            if( Array[i] == _element)
                removeAt(i);
        }
    }


}

提供されたヘルプに感謝します。または、私のコードが何らかの形で役に立った場合は、歓迎します

4

2 に答える 2

2

intはプリミティブであるため、Java ジェネリックでは使用できませんこれは、バイトコードの下位互換性を維持するためです(ジェネリックが最初に導入されたときに重要でした)。代わりにを使用する必要がありますInteger

NB、これを学術的な演習として行っている場合を除きList<T>、カスタム実装クラスの代わりに a を使用できます/使用する必要があります。

または、 Troveを使用します。

于 2012-05-10T18:22:52.297 に答える
0

Java プリミティブは Object のインスタンスではないため、ジェネリック型として使用できません。機能する理由int[]は、Java 配列がオブジェクトであるためです。Integer代わりに箱入りを使用してください。

于 2012-05-10T18:23:08.453 に答える