次の関数を使用すると、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
スロットが埋まっているかどうかを判断するにはどうすればよいですか?