函数中如何push_back含双成员的struct?合并对象时添加非重复元素
问题解决方案
1. 修复push_back内部结构体的调用错误
你当前的obj1.A.push_back(obj1.item())写法有误:item是assign_obj的私有内部结构体,不能通过对象实例访问类型,必须通过类名直接引用。正确的写法分两种场景:
- C++11及以上版本,用聚合初始化直接构造结构体实例:
result.A.push_back(assign_obj::item{item2.value, item2.count}); - 旧版C++,显式创建临时结构体对象再传入:
assign_obj::item new_item; new_item.value = item2.value; new_item.count = item2.count; result.A.push_back(new_item);
2. 实现非重复元素的添加逻辑
遍历obj2的每个元素时,先检查目标对象中是否存在相同value的元素:
- 存在:累加两个元素的
count值 - 不存在:将
obj2的该元素添加到目标对象的vector中
3. 合并前调用compact方法
按照需求,在合并逻辑执行前,先调用两个输入对象的compact方法(需确保compact是public成员函数,或友元可访问)。
4. 优化operator+的语义实现
当前代码直接修改obj1并返回,不符合+运算符的常规语义(不应修改输入操作数),建议创建新的assign_obj实例作为结果,避免破坏原对象的状态。
完整修正代码示例
class assign_obj{ private: struct item{ char value; int count; }; std::vector<item> A; int size; public: // 假设你已实现compact逻辑,这里声明为public供外部调用 void compact() { // 你的compact实现:比如合并相同value的元素、去重等 } friend const assign_obj operator+(assign_obj &, assign_obj &); }; const assign_obj operator+(assign_obj &obj1, assign_obj &obj2){ // 合并前先调用compact obj1.compact(); obj2.compact(); // 以obj1为基础创建结果对象,避免修改原obj1 assign_obj result = obj1; // 遍历obj2的所有元素 for(const auto& item2 : obj2.A){ bool is_duplicate = false; // 检查结果对象中是否存在相同value的元素 for(auto& item1 : result.A){ if(item1.value == item2.value){ item1.count += item2.count; is_duplicate = true; break; } } // 非重复元素则添加到结果中 if(!is_duplicate){ result.A.push_back(assign_obj::item{item2.value, item2.count}); } } // 更新结果对象的size成员(如果size是有效统计值) result.size = result.A.size(); return result; }
关键说明
- 私有内部结构体
item可在友元函数中通过assign_obj::item直接访问类型 - 使用范围for循环(C++11+)让代码更简洁,也可保留原索引循环写法
- 确保
compact方法已正确实现,否则合并前的预处理逻辑无法生效 - 返回新对象而非修改原对象,符合
+运算符的预期行为
内容的提问来源于stack exchange,提问作者Bobasaur
相关产品推荐
相关产品推荐

