6

次のようなコード(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 に書き直したいのですが、どうすればよいですか?

独自のスタックを作成する機会を調査しましたが、このコードをより軽量に書き直す方法、おそらく 2 次元配列があるかもしれません。これまでのところ、このリメイクの方法を考えることはできません。より経験豊富な人がその方法を教えてくれることを願っています:)

申し訳ありませんが、より高度な例を追加しました...

4

8 に答える 8

8

独自に作成する代わりに、C コンテナ ライブラリを試してみることをお勧めします (例: http://code.google.com/p/ccl/ )。

于 2012-12-29T17:44:21.343 に答える
1

C++ にほぼ相当するのは、vectorC 配列のサイズを変更することです (使用可能な要素よりも多くの要素を考慮するため)。

したがって、ベクトルの配列に相当するものはポインターの配列になります (サイズ変更の制約により、配列の配列はそれをカットしません)。

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++;
}
于 2012-12-29T17:42:39.423 に答える
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);
}
于 2012-12-29T20:28:50.547 に答える
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;
}
于 2015-12-10T20:48:41.627 に答える
0

c++ ベクトルに相当する C 標準はありませんが、c++ のベクトルに基づいて構造体を作成することはできます。構造体は

  • 配列の境界が最大サイズを渡された場合、それ自体のサイズを変更します
  • ベクトルと同様の操作を実行する

また

  • C++ ベクトルの構造をシミュレートする連結リスト スタック構造体を作成する
于 2012-12-29T17:42:13.250 に答える