使用结构表示向量

时间:2015-08-25 21:18:16

标签: c

我最近被要求使用结构数据类型表示结构。 据我所知,矢量表示为(10,20,30,40等) 出现通过索引数据结构访问向量会更容易,就像数组一样。 但是我不知道在struct数据类型中需要多少成员。那么我将如何定义结构呢?

3 个答案:

答案 0 :(得分:1)

向量基本上是一个动态数组,意味着底层类型是指向数组的指针,每次添加内容时,数组都会增加一个。在一个非常基本的情况下,每次这样做都会导致昂贵的副本;这是他们主要尝试预测下一个大小(通过加倍可用插槽的数量)或允许一个调整到最佳猜测的方式,如果错过,仍然会导致加倍。无论如何,插入(因此不在阵列的末端)仍然需要昂贵的副本。这意味着向量将对随机访问数据读取感兴趣,而写入则不然。

当你看到O-复杂性时,你会发现现在这很有意义。

  • 随机访问 - 常数O(1)
  • 插入或移除元素 最终 - 摊销常数O(1)
  • 插入或移除与向量O(n)
  • 末端成直线距离的元素

了解几个数据容器对于了解在哪种情况下选择哪个数据容器至关重要。更常见的是,我看到程序员总是使用一个向量(即使那些工作时间足够长,也不知道何时使用哪个容器)。

我确信这个解释会让你足以实现真正的事物; - )

来源:

答案 1 :(得分:0)

在C99中,您可以定义FAM struct

struct vector {
  size_t len;
  int vals[];
};

然后,您可以动态分配结构的实例,具体取决于您需要的长度。

struct vector* v = malloc(sizeof(struct vector) + (n * sizeof(v->vals[0]));
v->len = n;

for (int i = 0; i < v->len; i++)
  v->vals[i] = i;

更高维度的结构(例如矩阵)有点棘手,但我不确定你是否需要它。

答案 2 :(得分:0)

如果我想在C中表示一个int向量,我会使用:

  • 一个malloc&#39; d数组
  • 变量跟踪分配大小
  • 变量跟踪使用长度

它给出了:

struct int_vector {
    int *arr;
    unsigned int len;
    unsigned int size;
};

arr0<=i<len legal 的访问权限。

我会添加一些实用程序:

int resize(struct int_vector *vec, unsigned int new_len) {
    if (new_len > vec->size) {
        void *p;
        unsigned int size = vec->size;
        while(new_len > size) size *= 2;
        *p = realloc(vec->arr, sizeof(int) * size);
        if (p == NULL) return 0; /* cannot realloc */
        vec->arr = p;
        vec->size = size;
    }
    vec->len = new_len;
}

然后,您可以轻松实现推送和弹出:

unsigned int push(int_vector *vec, int val) {
    if (resize(vec, vec->len + 1) == 0) return 0;
    vec->arr[vec->len -1] = ival;
    return vec->len;
}
int pop(int_vector *vec) {
    vec->len -= 1;
    return vec->arr[vec->len];
}

您可以实现truncate函数来减少分配的大小,但这是一个简单但有效的例子。

不幸的是,由于C既没有泛型也没有模板,你必须为每个要处理的类型定义一个向量类...