如何根据输入参数创建方法计算集合并或差异?

时间:2017-11-22 05:28:39

标签: c++ vector set

我想写一个C ++方法,让我得到联合或设置两个自定义集对象的差异。

每个集合由std::vector<bool>对象和std::vector<set>对象表示。向量维护布尔集合成员信息,该集合包含每个集合成员的索引。目标集比源集大很多。

我希望能够为我的方法提供一个参数,让我选择是否返回联合或集合的差异。到目前为止,这是(一个非常简化的版本):

class SetObj{
  public:  
    std::vector<bool> bool_data;
    std::set<int> set_data;

    SetObj(std::vector<bool> bool_input, std::set<int> set_input) :
        bool_data(bool_input), set_data(set_input) {};

    SetObj(std::vector<int> int_input, int num_elements){
        bool_data = std::vector<bool>(num_elements, false);
        for (int i = 0; i < int_input.size(); ++i){
            bool_data[int_input[i]] = true;
            set_data.insert(int_input[i]);
        }
    };
};


void combineSets(const SetObj &src, SetObj &tgt, const bool get_union){

    if (get_union){
        for (auto it=src.set_data.begin(); it!=src.set_data.end(); ++it){
            if (src.bool_data[*it]){
                tgt.bool_data[*it] = true;
            }
            tgt.set_data.insert(*it);
        }
    }
    else{
        for (auto it=src.set_data.begin(); it!=src.set_data.end(); ++it){
            if (src.bool_data[*it]){
                tgt.bool_data[*it] = false;
            }
            tgt.set_data.erase(*it);
        }
    }
}

现在这对我想要的东西很好,但它只是感觉有点&#34; hackish&#34;因为它基本上在条件的两个分支中做同样的事情;它将vector对象的元素设置为true / false,并使用std::set中的insert / erase方法更新set对象,具体取决于union或difference。

有没有办法摆脱这种条件?

0 个答案:

没有答案