Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以使用std::pair作为std::set的键,而不使用每个元素的任何副本?_C++_C++11_Stl - Fatal编程技术网

C++ 是否可以使用std::pair作为std::set的键,而不使用每个元素的任何副本?

C++ 是否可以使用std::pair作为std::set的键,而不使用每个元素的任何副本?,c++,c++11,stl,C++,C++11,Stl,我试图使用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 &

我试图使用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::vector
,并在插入向量之前进行重复检查,如下所示:

auto fn=[](常数类型和e、常数类型和t){
返回e.nums.first==t.nums.first||
e、 nums.first==t.nums.second||
e、 nums.second==t.nums.first||
e、 nums.second==t.nums.second;
};
向量nums_-vec;
nums_vec.push_back(类型(1,2));
if(nums_vec.end()=查找if(nums_vec.begin(),nums_vec.end(),
绑定(fn,占位符::_1,类型(1,4)))
{nums_vec.push_back(类型(1,4));}
但是,我觉得对每个插入都这样做以避免重复不是一个好主意。
因此,我的问题是,是否也可以用
std::set
实现这些功能?

用于set的比较必须满足指定的要求。这些要求中包括诱导等价关系的传递性:

如果
等效(a,b)
等效(b,c)
等效(a,c)

具体案例:

  • a
    be
    {1,2}
    b
    be
    {1,4}
    ,和
    c
    be
    {3,4}
  • 及物性:如果
    {1,2}
    等价于
    {1,4}
    {1,4}
    等价于
    {3,4}
    ,那么
    {1,2}
    等价于
    {3,4}
表示
X
等同于
Y
的另一种方式是,集合中存在
X
会阻止添加
Y
。您希望
{1,2}
阻止
{1,4}
被添加到集合中。您希望
{1,4}
阻止
{3,4}
被添加到集合中。要获得所需的及物性,required需要
{1,2}
阻止
{3,4}
被添加到集合中,这是您不想要的


不,单靠集合使用的排序无法实现您的目标。

没有严格的弱排序可以使用,因此您不能使用
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::unordered_set
,它只需要提供相等性。

谢谢您的帮助。我认为这是可能的,所以我考虑了几个小时,但在阅读了你的答案后,一切都变得清晰了。谢谢,我会检查无序的集合。