我想写一个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。
有没有办法摆脱这种条件?