0

次の関数を使用すると、C-Vector 実装の特定のスロットに要素を挿入できます。

void CVectorInsert(CVector *cv, const void *elemAddr, int atIndex)
{
    assert(0 <= atIndex && atIndex <= cv->capacity);

    if (cv->numElements >= cv->capacity) {
        CVectorGrow(cv);
    }

    memmove((char *)cv->vector + (atIndex + 1) * cv->elemSize, (char *)cv->vector + atIndex * cv->elemSize, cv->elemSize * (cv->numElements - atIndex));
    memcpy((char *)cv->vector + atIndex * cv->elemSize, elemAddr, cv->elemSize);
    (cv->numElements)++;
}

ポジションが埋まっている場合はatIndex、要素を移動してスペースを空ける必要がありますが、atIndexポジションが埋まっていない場合は、要素を移動する必要がmemcpyあります。CVector がどのように定義されているかについての高度なアイデア:

struct CVectorImplementation {   
    int numElements;
    int capacity;
    int elemSize;
    void *vector;
    CVectorCleanupElemFn cleanupFn;
};

atIndexスロットが埋まっているかどうかを判断するにはどうすればよいですか?

4

2 に答える 2

0

要素が配置されたベクトルの最も遠い部分を追跡してみませんか? その最も遠い要素を超えている場合は、変数を更新し、シフトしません。そうでない場合は、シフトする必要があります。コンテナに奇妙なセマンティクスを与えるため、要素ごとの「満たされたかどうか」の状態を追跡することは意味がないと思います。(たとえば、スロット 5 と 6 が埋まっていて 5 に挿入する場合、5 を 6 に、6 を 7 に移動しますが、5 が埋まらない場合は何もせず、6 が埋まらない場合は 7 に何も入れませんか?ただ奇妙です)

于 2013-05-01T00:52:22.273 に答える