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 回答
0

Cdcontainers - C 的数据容器。cdcontainers 接口类似于 C++ STL。

https://github.com/maksimandrianov/cdcontainers

#define CDC_USE_SHORT_NAMES  // for short names (functions and structs without prefix cdc_*)
#include <cdcontainers/vector.h>
#include <cdcontainers/casts.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    vector_t *v;
    size_t i;

    if (vector_ctor(&v, NULL) != CDC_STATUS_OK)
        /* error handling */;

    if (vector_push_back(v, CDC_INT_TO_PTR(7)) != CDC_STATUS_OK)
        /* error handling */;

    if (vector_push_back(v, CDC_INT_TO_PTR(8)) != CDC_STATUS_OK)
        /* error handling */;

    for (i = 0; i < vector_size(v); ++i)
        printf("%i ", CDC_PTR_TO_INT(vector_get(v, i)));

    printf("\n");

    vector_dtor(v);

    return 0;
}
于 2018-04-03T15:32:04.667 回答