c++ - 是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?
问题描述
我正在尝试使用 struct 中的std::set
两个整数作为键来存储 struct。我知道可以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::set
,无论std::pair
. 像这样 :
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
?
解决方案
用于集合的比较必须满足比较命名要求。在这些要求中,有诱导等价关系的传递性:
如果
equivalent(a,b)
然后。equivalent(b,c)
_equivalent(a,c)
具体案例:
- 让我们
a
成为{1,2}
,b
成为{1,4}
,c
成为{3,4}
。 - 传递性: if
{1,2}
等价于{1,4}
and{1,4}
等价于{3,4}
then{1,2}
等价于{3,4}
.
另一种表达方式X
等同于您的集合Y
中的存在X
防止Y
被添加。您想{1,2}
防止{1,4}
被添加到集合中。您想{1,4}
防止{3,4}
被添加到集合中。为了具有所需的传递性,需要防止被添加到集合中,这是您不想要的。{1,2}
{3,4}
不,您的目标不能仅通过集合使用的顺序来实现。
推荐阅读
- php - PHP函数中的命名空间与全局?
- firebase - Firestore 复合查询 - 结合 not-in 和不等式?
- python - 熊猫用时间序列索引重塑数据框
- python - 用 2d 点和 2 个图像制作热图
- aws-lambda - IFTTT 的 AWS IOT 按钮切换
- r - 为什么我的 Rcpp 函数在使用大输入矩阵时会崩溃?
- regex - 正则表达式 Powershell
- vue.js - Vue组件上的两种数据流
- visual-studio - Visual Studio 安装程序 2019 社区 16.9 崩溃
- performance - 使用反向代理会否定 CDN 的效果吗?