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
相关产品推荐
相关产品推荐

