1

宿題の一部としてカスタムベクトルクラスを作成しています。私が現在やろうとしているのは、eraseという関数を実装することです。この関数は、引数として整数を取り、配列の長さを1減らし、引数で指定された位置の要素を削除し、最後にすべての要素を下にシフトして塗りつぶします。 「消去された」要素によって残されたギャップ。

この言語の経験が不足しているために私が完全に理解していないのは、ポインターの配列から単一の要素を削除する方法です。

現在、私は以下を実装しています:

        void myvector::erase(int i)
        {

            if(i != max_size)
            {
                for(int x = i; x < max_size; x++)
                {
                    vec_array[x] = vec_array[x+1];
                }
                vec_size --;

                //delete element from vector;
            }
            else
                //delete element from vector
        }

クラス宣言とコンストラクターは次のようになります。

template <typename T> 

class myvector
{
    private:
            T *vec_array;
            int vec_size;
            int max_size;
            bool is_empty;

    public:
            myvector::myvector(int max_size_input)
            {
                max_size = max_size_input;
                vec_array = new T[max_size];
                vec_size = 0;
            }

私は以下を試しました:

  1. 削除を使用して要素を削除しようとします

    vec_size[max_size]を削除します;

    vec_size [max_size] = NULL;

  2. 要素の値をNULLまたは0に設定する

    vec_size [max_size] = NULL

また

vec_size[max_size] = 0

演算子"="があいまいであるか、指定されたタイプをvoid *にキャストできないため、いずれも機能していません。

私はおそらく単純なものを見逃しているかもしれませんが、私はこれを通過することができないようです。どんな助けでも大歓迎です。繰り返しになりますが、これがばかげている場合は、経験不足で申し訳ありません。

4

2 に答える 2

2

カスタムベクトルクラスがstd::vectorのように機能することになっている場合は、オブジェクトの破棄について心配する必要はありません。要素を消去する必要がある場合は、それに続くすべての要素を1つ左にコピーするだけです。

void myvector::erase(int i)
{
    for (int x = i + 1; x < vec_size; x++) {
        vec_array[x - 1] = vec_array[x];
    }
    vec_size--;
}

これが、erase()関数が実行する必要のある基本的な作業のすべてです。

要素がたまたまポインタである場合は、気にする必要はありません。ベクトルクラスのユーザーは、必要に応じてこれらのポインターを削除する責任があります。それらが実際に削除できるかどうかを判断することはできません(ポインターは、削除できない自動スタック変数を指している可能性があります)。

deleteしたがって、ベクトルの要素を呼び出さないでください。

ベクトルクラスにclear()関数があり、要素が破棄されていることを確認したい場合は、次のようにします。

delete[] vec_array;
vec_array = new T[max_size];
vec_size = 0;

そして、これが実際にstd::vectorがどのように機能するかです。(まあ、その基本的なロジックです。もちろん、ベクトルの実装で多くのものを最適化することができます。)

于 2012-12-11T02:04:57.010 に答える
1

これは宿題なので、決定的な解決策は提供しませんが、値を消去する1つの方法を次に示します。

loop through and find value specified in erase function
mark values position in the array
starting from that position, move all elements values to the previous element(overlapping 'erased' value)
for i starting at position, i less than size minus one, i plus plus
    element equals next element 
reduce size of vector by 1

これが十分に大きなヒントであるかどうかを確認してください。

于 2012-12-11T02:00:22.220 に答える