C++如何实现字符频率统计并通过动态数组存储统计结果?
实现代码
#include <iostream> #include <string> using namespace std; struct unique_char { char character; int frequency; }; int main() { string str; getline(cin, str); // 动态数组初始化:初始容量为0,已存储元素个数为0 int capacity = 0; int size = 0; unique_char* chars = nullptr; // 遍历输入字符串的所有字符 for (char c : str) { bool is_exist = false; // 匹配已收录的字符 for (int i = 0; i < size; i++) { if (chars[i].character == c) { chars[i].frequency++; is_exist = true; break; } } // 未匹配到新字符,执行扩容逻辑 if (!is_exist) { // 按需求每次扩容1个单位,如需提升性能可改为容量翻倍 int new_capacity = capacity + 1; unique_char* new_arr = new unique_char[new_capacity]; // 拷贝原有字符数据到新数组 for (int i = 0; i < size; i++) { new_arr[i] = chars[i]; } // 写入新字符的初始数据 new_arr[size].character = c; new_arr[size].frequency = 1; // 释放旧数组内存,替换为新数组 delete[] chars; chars = new_arr; capacity = new_capacity; size++; } } // 输出统计结果 cout << "字符频率统计结果:" << endl; for (int i = 0; i < size; i++) { cout << "'" << chars[i].character << "' : " << chars[i].frequency << endl; } // 释放动态申请的内存,避免泄漏 delete[] chars; system("PAUSE"); return 0; }
核心实现说明
- 废弃固定长度100的数组声明,改为初始空指针,每次遇到未收录字符时申请更大的新数组、拷贝旧数据、释放旧数组,实现完全动态扩容。
- 用
size变量记录已收录的唯一字符总数,查找匹配时仅需要遍历到size位置即可,不需要遍历整个数组容量,减少无效运算。 - 如果需要优化扩容性能,可以不用每次仅扩容1个单位,改为每次容量翻倍(初始容量设为2,满了之后扩容到4、8、16依次类推),减少内存申请和数据拷贝的总次数,仅需要修改扩容部分的容量计算逻辑即可。
内容的提问来源于stack exchange,提问作者dekaottoman
相关产品推荐
相关产品推荐

