程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复??

开发过程中遇到是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?的问题如何解决?下面主要结合日常开发的经验,给出你关于是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?的解决方法建议,希望对你解决是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?有所启发或帮助;

我正在尝试使用结构中的两个整数作为键将结构存储在 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::set 中元素的顺序如何,我都希望可搜索且没有重复的 std::pair。 像这样:

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,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 来实现这些功能?

解决方法

用于集合的比较必须满足 Compare 命名要求。这些要求包括诱导等价关系的传递性:

如果 equivalent(a,b)equivalent(b,C)equivalent(a,C)

具体案例:

  • a{1,2}b{1,4}c{3,4}
  • 传递性:如果 {1,2} 等价于 {1,4} 并且 {1,4} 等价于 {3,4} 那么 {1,2} 等价于 { {1}}。

表达 {3,4} 等价于 X 的另一种方式是,Y 在您的集合中的存在会阻止添加 X。您希望 Y 阻止将 {1,2} 添加到集合中。您希望 {1,4} 阻止将 {1,4} 添加到集合中。要获得所需的传递性,要求 {3,2} 添加到集合中,而这是您想要的。

不,您的目标不能仅通过集合使用的顺序来实现。

,

没有您可以使用的严格弱排序,因此您不能使用 std::set

但是,您可以使用 std::unordered_set,它只需要提供相等性。

大佬总结

以上是大佬教程为你收集整理的是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?全部内容,希望文章能够帮你解决是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。