You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数中如何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:50:42