如何访问vector<multiset<char>>中的元素并实现分组输出?
解决C++分组存储multiset到vector及遍历输出问题
问题根源
你的代码存在三个核心问题:
- 分组存储逻辑错误:当
multiset的大小达到5时,仅将其插入一次vector,但没有清空当前multiset,导致后续元素继续追加到同一个集合中,最终vector里只会有一个包含全部10个元素的multiset。 showItem函数未实现:没有编写遍历vector中每个multiset元素的逻辑,无法输出内容。- 不必要的动态内存分配:用
new创建multiset容易引发内存泄漏,直接使用栈上对象更安全高效。
修正后的完整代码
#include <iostream> #include <set> #include <vector> #include <array> using namespace std; class MyCharector { vector<multiset<char>> vp; public: // 空析构函数可省略,编译器会自动生成默认实现 ~MyCharector() = default; void addToVector(multiset<char> s) { vp.push_back(s); } void getItem(const char* item, int count) { multiset<char> currentSet; // 用栈对象替代动态分配,避免内存泄漏 for (int i = 0; i < count; ++i) { currentSet.insert(item[i]); // 每满5个元素就存入vector并清空当前集合 if (currentSet.size() == 5) { addToVector(currentSet); currentSet.clear(); } } // 处理剩余不足5个的元素(适配总数不是5倍数的场景) if (!currentSet.empty()) { addToVector(currentSet); } } void showItem() { // 嵌套范围for遍历vector中的每个multiset及其元素 for (const auto& ms : vp) { for (char c : ms) { cout << c << " "; } cout << endl; // 每组输出后换行 } } }; int main(int argc, const char* argv[]) { MyCharector my; array<char,10> item = { 'a','a','e','d','g','f','c','c','h','b' }; my.getItem(item.data(), item.size()); // 传递元素总数,增强代码健壮性 my.showItem(); return 0; }
关键修改说明
- 分组逻辑修复:每次
multiset满5个元素时,将其添加到vector后立即调用clear()清空,确保后续元素存入新的集合。同时增加了剩余元素的处理逻辑,适配元素总数不是5倍数的场景。 - 遍历输出实现:
showItem中使用嵌套范围for循环,外层遍历vector中的每个multiset,内层遍历集合中的字符,每组输出完成后换行,符合你要求的每行5个元素的格式。 - 内存优化:移除了动态分配的
multiset,改用栈上局部对象,避免内存泄漏,同时代码更简洁。 - 代码健壮性提升:
getItem函数新增了元素总数参数,不再硬编码10,适配不同长度的输入。
输出结果(multiset会自动按字符顺序排序):
a a d e g b c c f h
内容的提问来源于stack exchange,提问作者Hys
相关产品推荐
相关产品推荐

