You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中C++ emplace、reserve函数及size_t的等价替代方案

问题解答

1. size_t 类型处理

C 标准库 <stddef.h> 原生定义了 size_t 类型,语义和 C++ 完全一致,直接引入头文件即可使用,不需要额外适配。

2. 替换 std::vector 的动态数组实现

C 没有内置动态数组容器,需要手动实现等价结构模拟 vector 的核心属性,注意原代码中的 class 是 C++ 关键字,即使在 C 环境也建议改名避免冲突:

#include <stddef.h>
#include <stdlib.h>
#include <string.h>

// 版本1:存储平铺的float元素(对应你原代码的std::vector<float>)
typedef struct _student {
    float *classes;
    size_t size;    // 实际存储元素个数,等价vector::size()
    size_t capacity;// 预分配的总容量,等价vector::capacity()
} student;

// 版本2(如果你的需求是按组存储5个float,更贴合原二维数组逻辑):
// typedef struct _student {
//     float (*classes)[5];
//     size_t size;
//     size_t capacity;
// } student;

3. reserve 函数等价实现

reserve 的作用是预分配指定容量的内存、不改变实际元素计数,用 C 的 realloc 即可实现:

// 版本1对应reserve实现
void student_reserve(student *s, size_t new_cap) {
    if (new_cap <= s->capacity) return;
    float *new_buf = realloc(s->classes, new_cap * sizeof(float));
    if (new_buf) {
        s->classes = new_buf;
        s->capacity = new_cap;
    }
}

// 版本2对应reserve实现
// void student_reserve(student *s, size_t new_cap) {
//     if (new_cap <= s->capacity) return;
//     float (*new_buf)[5] = realloc(s->classes, new_cap * sizeof(float[5]));
//     if (new_buf) {
//         s->classes = new_buf;
//         s->capacity = new_cap;
//     }
// }

4. 末尾emplace等价实现

你原代码中 emplace(class.end(), rollnums[i]) 等价于往数组末尾插入元素,对应实现如下:

// 版本1对应插入逻辑:插入长度为5的float数组
void student_emplace_rollnum(student *s, const float rollnum[5]) {
    // 容量不足时自动扩容,你代码中已经提前reserve,实际不会触发该逻辑
    if (s->size + 5 > s->capacity) {
        size_t new_cap = s->capacity == 0 ? 8 : s->capacity * 2;
        while (new_cap < s->size +5) new_cap *=2;
        student_reserve(s, new_cap);
    }
    memcpy(s->classes + s->size, rollnum, 5 * sizeof(float));
    s->size +=5;
}

// 版本2对应插入逻辑:直接插入float[5]类型元素
// void student_emplace_rollnum(student *s, const float rollnum[5]) {
//     if (s->size +1 > s->capacity) {
//         size_t new_cap = s->capacity ==0 ? 8 : s->capacity *2;
//         student_reserve(s, new_cap);
//     }
//     memcpy(s->classes[s->size], rollnum, 5*sizeof(float));
//     s->size +=1;
// }

5. 原模板构造函数的C等价实现

C 没有模板语法,直接把数组长度X作为参数传入即可:

// 等价原模板构造函数功能
student* student_init(size_t X, const float rollnums[X][5]) {
    student *s = malloc(sizeof(student));
    if (!s) return NULL;
    memset(s, 0, sizeof(student));
    // 版本1对应reserve参数:总元素数为X*5
    student_reserve(s, X *5);
    // 版本2对应reserve参数:总组数为X
    // student_reserve(s, X);
    for (size_t i=0; i<X; i++) {
        student_emplace_rollnum(s, rollnums[i]);
    }
    return s;
}

// 用完手动释放内存,C无自动析构机制
void student_destroy(student *s) {
    if (s) {
        free(s->classes);
        free(s);
    }
}

内容的提问来源于stack exchange,提问作者P Pp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:57:04