以下函数允许在 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
插槽是否已满?