gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:05:36 26 4
gpt4 key购买 nike

我正在尝试将结构存储在 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, 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而是在插入 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命名要求。这些要求包括诱导等价关系的传递性:

If equivalent(a,b) and equivalent(b,c) then equivalent(a,c).


一个具体的案例:
  • a{1,2} , b{1,4} , 和 c{3,4} .
  • 传递性:如果 {1,2}相当于 {1,4}{1,4}相当于 {3,4}然后 {1,2}相当于 {3,4} .

  • 另一种表达方式 X相当于 YX的存在在您的设置中阻止 Y从被添加。你要 {1,2}防止 {1,4}从被添加到集合中。你要 {1,4}防止 {3,4}从被添加到集合中。要具有所需的传递性,它是 需要 那个 {1,2}防止 {3,4}从被添加到集合中,这是你做的事情 不是 想。
    不,您的目标不能仅通过集合使用的顺序来实现。

    关于c++ - 是否可以使用 std::pair 作为 std::set 的键而每个元素没有任何重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66236104/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com