【发布时间】:2021-05-19 23:55:38
【问题描述】:
我正在尝试使用 struct 中的两个整数作为键将 struct 存储在 std::set 中。
我知道可以使用std::pair 作为std::set 的键。
struct TYPE{
pair<int, int> nums;
... // some other things
TYPE(){}
TYPE(int first, int second) { nums = make_pair(first, second); }
bool operator<(const TYPE &rhs) const{
return nums < rhs.nums;
}
};
set<TYPE> nums_set;
nums_set.insert(TYPE(1, 2));
nums_set.insert(TYPE(1, 4));
nums_set.insert(TYPE(5, 2));
// size of set : 3, (1,2)(1,4)(5,2)
auto it = nums_set.find(TYPE(1, 2)); // find return (1,2)
但是,无论std::pair 中元素的顺序如何,我都希望std::set 可搜索且不重复。
像这样:
nums_set.insert(TYPE(1, 2));
nums_set.insert(TYPE(1, 4)); // failed. duplicate 1
nums_set.insert(TYPE(4, 2)); // failed. duplicate 2
nums_set.insert(TYPE(4, 1)); // failed. duplicate 1
nums_set.insert(TYPE(3, 4));
// size of set : 2, (1,2)(3,4)
auto it = nums_set.find(TYPE(2, 7)); // find return (1,2).
目前最简单的解决方案是使用std::vector,并在插入向量之前进行重复检查,如下所示:
auto fn = [](const TYPE& e, const TYPE&& t){
return e.nums.first == t.nums.first ||
e.nums.first == t.nums.second ||
e.nums.second == t.nums.first ||
e.nums.second == t.nums.second;
};
vector<TYPE> nums_vec;
nums_vec.push_back(TYPE(1, 2));
if(nums_vec.end() == find_if(nums_vec.begin(), nums_vec.end(),
bind(fn, placeholders::_1, TYPE(1,4))))
{ nums_vec.push_back(TYPE(1,4)); }
但是,我认为对每个插入都执行此操作以避免重复并不是一个好主意。
那么,我的问题是,是否也可以使用std::set 来实现这些功能?
【问题讨论】: