C++ C++;C语言中的向量等价
我有一个代码(C++),看起来像这样C++ C++;C语言中的向量等价,c++,c,vector,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); } 向量值[10000]; int i,j; 而(……){ scanf(“%d%d”、&i和&j); 值[i]。推回(j); 值[j]。推回(i); }
vector<int> values[10000];
int i, j;
while (.....) {
scanf("%d%d", &i, &j);
values[i].push_back(j);
values[j].push_back(i);
}
向量值[10000];
int i,j;
而(……){
scanf(“%d%d”、&i和&j);
值[i]。推回(j);
值[j]。推回(i);
}
但是我想把这段代码重写成C语言。我该怎么做呢
我研究了制作自己的堆栈的机会,但可能有更轻量级的方法来重写代码,可能是二维数组。到目前为止,我还无法想象这部翻拍片是如何进行的,我希望有更有经验的人告诉我怎么做:)
对不起,添加了一个更高级的例子…< p>没有C标准等价于C++向量,尽管你可以在C++中用向量创建一个结构。结构将
- 如果数组边界超过最大大小,则调整自身大小
- 执行与向量类似的操作
一个C++等价的代码>向量< /C> >将是一个调整C数组(考虑到更多元素的可用性)。
因此,向量数组的等价物将是指针数组(数组数组不会剪切它,因为大小限制) 不过,您需要考虑大小,因此您可以从外部执行,也可以将逻辑封装到结构中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++;
}
int大小[1000];
整数元素[1000];
//所有大小和元素最初为0
对于(int i=0;i<10;i++){
if(无元素[i]>=大小[i])
{
//为值[i]分配更多内存;
//将旧内容复制到新内存中
//更新大小[i]
}
数值[i][n元素]=10;
noElements++;
}
您可以尝试使用C容器库,而不是自己滚动,例如类似以下内容:
#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);
}
#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;
}
#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;
}
#包括
#包括
类型定义结构\u darray
{
大小;
尺寸大于实际尺寸;
int*内容;
}达雷;
无效darray_创建(darray*d)
{
d->实际尺寸=d->尺寸=0;
d->content=NULL;
}
void darray_append(darray*d,int v)
{
如果(d->尺寸+1>d->实际尺寸)
{
尺寸\u t新尺寸;
如果(!d->实际尺寸)
{
新的_大小=1;
}
其他的
{
新尺寸=d->实际尺寸*2;
}
int*temp=realloc(d->content,sizeof(int)*新大小);
如果(!temp)
{
fprintf(stderr,“扩展数组失败(新大小=%zu)”,新大小;
退出(退出失败);
}
d->实际尺寸=新尺寸;
d->content=temp;
}
d->内容[d->大小]=v;
d->size++;
}
常数int*darray\u数据(darray*d)
{
返回d->content;
}
无效darray_销毁(darray*d)
{
免费(d->内容);
d->content=NULL;
d->尺寸=d->实际尺寸=0;
}
大小\u t darray\u大小(darray*d)
{
返回d->size;
}
int main()
{
int i;
darray myarray;
常数int*a;
darray_创建(&myarray);
对于(i=0;i<100;i++)
{
darray_追加(&myarray,i);
}
a=darray_数据(&myarray);
对于(i=0;i
我很震惊,您将不得不以80年代的方式在普通C语言中使用堆内存
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;
}
typedef结构tagArrayDesc{
int*arr;
顶部尺寸;
保留大小;
}ArrayDesc;
#定义EC(名称,T)大小,确保容量大小\
T**vec\
尺寸(保留)\
{ \
保留新尺寸\
新_保留=保留\
如果(保留<大小){\
如果(保留!=0){\
保留的新_*=2\
}否则{\
新_保留=0x10\
} \
} \
如果(新的_保留<大小){\
新_保留=(尺寸*4)/3\
} \
如果(新的保留>保留){\
*vec=realloc(*vec,sizeof(**vec)*保留新功能)\
memset((*vec)+保留,0,sizeof(T)*(new_保留-保留))\
} \
返回保留的新文件\
}
EC(_int,int)
EC(_array_desc,ArrayDesc)
int main()
{
ArrayDesc*行=NULL;
大小\u t行\u大小=0;
保留行的大小=0;
while(true){
int i,j;
scanf(“%d%d”、&i和&j);
行\保留=确保容量\阵列\描述(i+1,&行,行\保留);
行[i].reserved=确保容量(j+1,&rows[i].arr,行[i].reserved);
行[i].arr[j]=42;
}
返回0;
}
您必须使用。这并不难。每次必须插入新项目时,只需使用realloc。有人认为是这样的:
#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);
}
#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;
}
#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;
}
#包括
typedef结构{}用户类型;
int currentSize=0;
用户类型*值;
///向values方法添加新值
void addValue(const UserType和newValue)
{
++电流大小;
值=静态_转换(realloc(值,当前大小));
如果(值==NULL)
//内存分配字段,将修复代码放在此处
*(值+当前大小)=新值;
}
记住,您必须使用free
来释放值的内存。此外,如果将结束,您可能不会释放分配的内存