2013-05-01 56 views
0

以下功能允許在一個C-向量執行一個給定的槽插入的元件:如何確定內存插槽是否填充到C矢量中?

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是如何定義的高elevel的想法:

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

我怎麼能確定atIndex插槽已經被填充或不?

回答

0

爲什麼不跟蹤元素放置到矢量中的最遠位置?如果它超出了最遠的元素,則更新變量並且不要移位。如果不是,你必須轉移。我不認爲跟蹤每個元素'已經被填充或沒有'狀態是有意義的,因爲它給容器提供了奇怪的語義。 (例如,如果插槽5和6被填充,並且我插入5,我移動5到6和6到7,但是如果5沒有填充,那麼我什麼也不做,如果6沒有填充,那麼沒有任何內容會進入7?只是奇怪)

+0

你能告訴我更多關於它嗎? – cybertextron 2013-05-01 01:00:42

+0

@philippe int furthestIndex = 0;並在插入時檢查/更新 – Patashu 2013-05-01 01:06:38