C语言中的C ++向量

时间:2012-12-29 17:38:50

标签: c++ c vector

我有一个看起来像这样的代码(C ++)

vector<int> values[10000];

int i, j; 
while (.....) {
    scanf("%d%d", &i, &j);
    values[i].push_back(j);
    values[j].push_back(i);
}

但我想将此代码重写为C.我该怎么做?

我研究了制作自己的堆栈的机会,但也许有更轻量级的方法来重写这个代码,也许是二维数组。到目前为止,我无法想象这是如何重拍的,我希望有更有经验的人告诉我该怎么做:)

对不起,伙计们,增加了一个更高级的例子......

8 个答案:

答案 0 :(得分:8)

您可能想要尝试使用C容器库,而不是自己滚动。 http://code.google.com/p/ccl/

答案 1 :(得分:1)

C ++ vector的粗略等价物将是一个调整大小的C数组(以考虑比可用元素更多的元素)。

Ergo,相当于一个向量数组将是一个指针数组(由于调整大小约束,数组数组不会删除它。)

int* values[1000];

您需要考虑大小,因此您可以在外部执行此操作或将逻辑包装在结构中。

int sizes[1000];
int noElements[1000]
//all sizes and noElements initially 0

for (int i = 0; i < 10; i++) {
    if ( noElements[i] >= sizes[i] )
    {
        //allocate more memory for values[i];
        //copy old contents into the new memory
        //update sizes[i]
    }
    values[i][noElements] = 10;
    noElements++;
}

答案 2 :(得分:1)

这样的事情:

#include <stdio.h>
#include <stdlib.h>


typedef struct _darray
{
    size_t size;
    size_t actual_size;
    int *content;
} darray;


void darray_create(darray *d)
{

    d->actual_size = d->size = 0;
    d->content = NULL;
}

void darray_append(darray *d, int v)
{
    if (d->size+1 > d->actual_size)
    {
    size_t new_size;
    if (!d->actual_size) 
    { 
        new_size = 1;
    }
    else
    {
        new_size = d->actual_size * 2;
    }
    int *temp = realloc(d->content, sizeof(int) * new_size);
    if (!temp)
    {
        fprintf(stderr, "Failed to extend array (new_size=%zu)\n", new_size);
        exit(EXIT_FAILURE);
    }
    d->actual_size = new_size;
    d->content = temp;
    }
    d->content[d->size] = v;
    d->size++;
}

const int* darray_data(darray *d)
{
    return d->content;
}


void darray_destroy(darray *d)
{
    free(d->content);
    d->content = NULL;
    d->size = d->actual_size = 0;
}


size_t darray_size(darray *d)
{
    return d->size;
}


int main()
{
    int i;
    darray myarray;
    const int *a;

    darray_create(&myarray);

    for(i = 0; i < 100; i++)
    {
    darray_append(&myarray, i);
    }
    a = darray_data(&myarray);
    for(i = 0; i < darray_size(&myarray); i++)
    {
    printf("i=%d, value=%d\n", i, a[i]);
    }
    darray_destroy(&myarray);
}

答案 3 :(得分:1)

您可以尝试这样的事情:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct vector
{
    int len;
    int allocated;
    int step;
    int *data;
};


#define INIT_SIZE 1


void init_vector(struct vector *v)
{
    v->len = 0;
    v->allocated = 0;
    v->step = 2;
    v->data = NULL;
}


int append(struct vector *v, int item)
{
    if (!v->data)
    {
        v->data = malloc(INIT_SIZE * sizeof(int));

        if (!v->data)
            return -1;

        v->allocated = INIT_SIZE;
    }
    else
        if (v->len >= v-vallocated)
        {
            int *tmp = realloc(v->data, 
                        v->allocated * v->step * sizeof(int));

            if (!tmp)
                return -1;

            v->data = tmp;
            v->allocated *= v->step;
        }

    v->data[v->len] = item;
    v->len++;

    return 0;
}


int delete(struct vector *v, int index)
{
    if (index < 0 || index >= v->len)
        return -1;

    memmove(v->data + index, v->data + index + 1,
                      (v->len - index - 1) * sizeof(int));
    v->len--;

    return 0;
}


void print(const struct vector *v)
{
    printf("Array:\n");

    for (int i = 0; i < v->len; i++)
        printf("%d ", v->data[i]);

    printf("\n");
}


int main(void)
{
    struct vector v;
    int rc;

    init_vector(&v);

    rc = append(&v, 1);
    assert(rc == 0);

    rc = append(&v, 2);
    assert(rc == 0);

    rc = append(&v, 3);
    assert(rc == 0);

    rc = append(&v, 4);
    assert(rc == 0);

    rc = append(&v, 5);
    assert(rc == 0);

    print(&v);

    rc = delete(&v, 2);
    assert(rc == 0);

    print(&v);

    free(v.data);

    return 0;
}

答案 4 :(得分:1)

您可以使用Gena库。它与stl::vector非常相似,而其纯为C89

您可以在此处查看:

https://github.com/cher-nov/Gena

答案 5 :(得分:0)

没有C标准等同于c ++向量,尽管你可以在c ++中创建一个基于向量的结构。结构将

  • 如果数组边界传递最大值
  • ,则调整自身大小
  • 执行类似于向量
  • 的操作

OR

  • 创建一个模拟c ++向量的链表列表结构

答案 6 :(得分:0)

我很害怕你必须在平原C中以80年代的方式使用堆内存。

typedef struct tagArrayDesc {
  int* arr;
  size_t top;
  size_t reserved;
} ArrayDesc;

#define EC(NAME, T) size_t ensure_capacity##NAME##(size_t size,            \
                                                   T** vec,                \
                                                   size_t reserved)        \
{                                                                          \
  size_t new_reserved;                                                     \
  new_reserved = reserved;                                                 \
  if (reserved < size) {                                                   \
    if (reserved != 0) {                                                   \
      new_reserved *= 2;                                                   \
    } else {                                                               \
      new_reserved = 0x10;                                                 \
    }                                                                      \
  }                                                                        \
  if (new_reserved < size) {                                               \
    new_reserved = (size * 4) / 3;                                         \
  }                                                                        \
  if (new_reserved > reserved) {                                           \
    *vec = realloc(*vec, sizeof(**vec) * new_reserved);                    \
    memset((*vec) + reserved, 0, sizeof(T) * (new_reserved - reserved));   \
  }                                                                        \
  return new_reserved;                                                     \
}

EC(_int, int)
EC(_array_desc, ArrayDesc)

int main()
{
  ArrayDesc* rows = NULL;
  size_t rows_size = 0;
  size_t rows_reserved = 0;
  while (true) {
    int i, j;
    scanf("%d%d", &i, &j);
    rows_reserved = ensure_capacity_array_desc(i + 1, &rows, rows_reserved);
    rows[i].reserved = ensure_capacity_int(j + 1, &rows[i].arr, rows[i].reserved);
    rows[i].arr[j] = 42;
  }
  return 0;
}

答案 7 :(得分:0)

您必须使用dynamic memory allocation。这并不难。每次必须插入新项目时,只需使用realloc。有些想法如下:

#include <cstdlib>

typedef struct { } UserType;

int currentSize = 0;
UserType* values;

/// Add new value to values method
void addValue(const UserType& newValue)
{
    ++currentSize;
    values = static_cast<UserType*>(realloc(values, currentSize));
    if (values == NULL)
        // memory allocation filed, place fix code here
        *(values + currentSize) = newValue;
}

请记住,您必须使用free获取values的免费记忆。此外,如果现在就结束工作,您可能不会释放已分配的内存。