C++将小数组追加至大数组末尾及数组重置问题(Arduino)
固定长度数组末尾追加可变长度数组的原生实现(C++11/Arduino)
核心需求实现
已知固定长度为10的outputArray,需将inputArray的前arrLength个元素追加至其末尾,同时满足不使用STL、C++11标准、内存与时间高效的约束。
实现代码
constexpr int OUTPUT_ARRAY_SIZE = 10; void appendToEnd(char outputArray[OUTPUT_ARRAY_SIZE], const char inputArray[], int arrLength) { // 边界检查:避免越界或无效长度 if (arrLength <= 0 || arrLength > OUTPUT_ARRAY_SIZE) { return; } // 计算追加的起始索引:大数组末尾往前数arrLength个位置 int startIdx = OUTPUT_ARRAY_SIZE - arrLength; // 使用memcpy高效拷贝:底层块操作,比手动循环更高效 memcpy(outputArray + startIdx, inputArray, static_cast<size_t>(arrLength) * sizeof(char)); }
说明
- 用
constexpr定义数组长度(C++11特性),保证编译期常量,避免魔法数字。 - 边界检查是必要的:防止
arrLength为负数或超过大数组长度导致内存越界。 memcpy是C标准库原生函数,Arduino环境完全支持,无需STL。它通过底层块内存拷贝实现,时间效率远高于手动循环逐个赋值,且无额外临时变量开销。
补充问题解答:前置元素重置是否需要两次循环?
不需要两次手动循环,可通过**memset+memcpy的组合**实现高效处理,两者均为底层优化的块操作,比手动循环更高效。
实现代码
constexpr int OUTPUT_ARRAY_SIZE = 10; void resetAndAppend(char outputArray[OUTPUT_ARRAY_SIZE], const char inputArray[], int arrLength) { // 边界检查 if (arrLength <= 0 || arrLength > OUTPUT_ARRAY_SIZE) { return; } int resetLength = OUTPUT_ARRAY_SIZE - arrLength; // 用memset批量重置前resetLength个元素为'-' memset(outputArray, '-', static_cast<size_t>(resetLength) * sizeof(char)); // 追加inputArray内容 memcpy(outputArray + resetLength, inputArray, static_cast<size_t>(arrLength) * sizeof(char)); }
说明
memset可一次性将连续内存块设置为指定值(这里是'-'),属于O(n)的块操作,比手动循环逐个赋值效率更高。- 若坚持用手动循环,也可在一次循环内完成:先遍历前
resetLength个元素设为'-',接着遍历剩余位置拷贝inputArray的元素,但这种方式的效率不如memset+memcpy(编译器对标准库内存操作函数有专门优化)。 - 当
arrLength == OUTPUT_ARRAY_SIZE时,resetLength为0,memset不执行,直接覆盖整个大数组,逻辑自洽。
内容的提问来源于stack exchange,提问作者GZstudio GZstudio
相关产品推荐
相关产品推荐

