Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用结构表示向量_C - Fatal编程技术网

C 用结构表示向量

C 用结构表示向量,c,C,我最近被要求使用struct数据类型来表示结构。 据我所知,向量表示为(10、20、30、40等) 似乎更容易通过索引数据结构(如数组)访问向量。 但是我不知道在struct数据类型中需要多少成员。那么我将如何定义结构呢?向量基本上是一个动态数组,这意味着底层类型是指向数组的指针,每次添加内容时,数组都会增加一个。在一个非常基本的情况下,每次这样做都会导致成本高昂的副本;这是他们通常尝试预测下一个大小(通过将可用插槽数量加倍)或允许调整大小以获得最佳猜测的方式,如果错过,仍将导致加倍。无论如何,

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

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

当你观察O复杂性时,你会发现这现在是有意义的

  • 随机存取-常数O(1)
  • 在位置插入或删除元素 期末摊销常数O(1)
  • 插入或删除到向量O(n)末端的线性距离的元素
了解这几个数据容器对于理解在什么情况下选择哪个数据容器至关重要。更常见的情况是,我看到程序员总是使用向量(即使是那些做这项工作的时间足够长,能够理解何时使用哪个容器的程序员)

我相信这个解释会给你足够的信息来实现真正的东西;-)

资料来源:


在C99中,您可以定义FAM
结构

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;
struct vector*v=malloc(sizeof(struct vector)+(n*sizeof(v->vals[0]);
v->len=n;
对于(int i=0;ilen;i++)
v->vals[i]=i;

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

如果我想用C表示int向量,我会使用:

  • malloc'd数组
  • 一个可变的跟踪分配大小
  • 一种可变长度跟踪算法
它给出:

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

访问
arr
0是合法的。您可以尝试创建一个动态数组。为几个元素分配空间,填充时,创建一个两倍大的新元素。有关更多信息,您可以查看此项:如果我们讨论的是固定维度的向量,例如2d,则将它们表示为两个字段的结构是非常自然的
 x
y
。我猜OP指的是他需要多少成员,而不是维度?…可能是我错了,但我建议OP澄清这一点?
vector
在编程方面是一个模棱两可的术语..嗯,这一点很有道理,或许OP可以重新表述一下这个问题,所以我们确信我们在这里讨论的是同一件事?或者……我的SPEYSEY感觉模糊性!你到底是什么意思?所有描述的东西都可以在C中完成)……我知道链接是C++引用,因为C++中有一个实现。但同样的特征仍然适用:-)你怎么知道这是向量OP所追求的?我同意这个问题是模糊的,我第一次读到它时,我相信,这就是他想要的。。。然而,再次阅读(多亏了你),让我产生了疑问:p我将坐在这里,等待OP的澄清,然后再继续删除这个答案:-)“更高的维度有点棘手,但我不确定你是否需要这些。”-这部分毫无意义。您编写的内容已经支持“更高”维度。实际上,它并不分配内存,但它不包括访问需要修改
结构的值。例如,二维或三维。你是什么意思?向量的维数是它的长度。您可能会与矩阵混淆。VAL[0]是x,VAL[1]是y。。。如果不是,我不知道你对这个结构的意图是什么。这就是我所指的,一个更高维度的结构。我改变了措辞
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];
}