C++ 如何将不同的对添加到集合中?

C++ 如何将不同的对添加到集合中?,c++,algorithm,c++11,compare,stdset,C++,Algorithm,C++11,Compare,Stdset,我试图将几对int插入一个集合,这些对没有任何顺序;也就是说,(1,2)=(2,1)。因此,我只需做如下工作 typedef pair<int, int> pairs; set<pairs> Set; pair <int,int> myPair; // adding pairs: myPair=pair<int,int>(0,1); pathSet.insert(myPair); myPair=pair<int,int>(0,2)

我试图将几对
int
插入一个集合,这些对没有任何顺序;也就是说,
(1,2)=(2,1)
。因此,我只需做如下工作

typedef pair<int, int> pairs; 

set<pairs> Set;
pair <int,int> myPair;

// adding pairs:
myPair=pair<int,int>(0,1);
pathSet.insert(myPair);
myPair=pair<int,int>(0,2);
pathSet.insert(myPair);
myPair=pair<int,int>(1,0);
pathSet.insert(myPair);
我想要

(0,1), (0,2)

如何避免重复?有办法吗?与“set”相比,在效率方面是否有更好的ADT,如
std::unordered\u set

您需要一个自定义比较函数。在这里,确保在比较时一对元素的顺序无关紧要。一个简单的方法是让配对中的第一个元素始终是较小的元素(否则交换第一个和第二个)

代码可能如下所示:

int main() {

    typedef pair<int, int> pairs;

    auto cmp = [](pairs a, pairs b) {
        if (a.first > a.second) {
            swap(a.first, a.second);
        }
        if (b.first > b.second) {
            swap(b.first, b.second);
        }
        return a < b;
    };
    set<pairs, decltype(cmp)> pathSet(cmp);

    pairs myPair=pair<int,int>(0,1);
    pathSet.insert(myPair);
    myPair=pair<int,int>(0,2);
    pathSet.insert(myPair);
    myPair=pair<int,int>(1,0);
    pathSet.insert(myPair);

    cout << pathSet.size();
}
在使用
std::pair
作为模板类型时,您需要一个for
std::set
。在C++11中,也可以将其设置为lambda

compare
函数的思想是首先检查
是否为
Pair.first
,如果不是,则在
compare
函数中交换以使它们按顺序排列。这不会更改原始插入对元素的顺序,但会删除您提到的重复项

auto compare = [](pairs lhs, pairs rhs) 
   {
      if(lhs.first > lhs.second ) lhs = pairs{lhs.second, lhs.first };
      if(rhs.first > rhs.second ) rhs = pairs{rhs.second, rhs.first };
      return lhs< rhs;
   };

我建议您学习自定义函数。谢谢链接。但是我不明白如果有人不知道一些事情,在这里问什么是错的?为什么其他人要给负分?也许我找不到它,也不知道从哪里开始,我问它在这里!这太不公平了,太令人失望了@一些程序员认为海报应该做一些研究,比如找到一个参考,比如我链接到的参考,看到可能的比较参数,然后尝试使用它,如果不起作用,问一个关于如何使用它的问题。不幸的是,有些人认为所有的新手问题都没有得到足够的研究,结果被否决了。即使你已经和跟随你仍然有被否决的风险。
2
auto compare = [](pairs lhs, pairs rhs) 
   {
      if(lhs.first > lhs.second ) lhs = pairs{lhs.second, lhs.first };
      if(rhs.first > rhs.second ) rhs = pairs{rhs.second, rhs.first };
      return lhs< rhs;
   };
#include <iostream>
#include <set>

typedef std::pair<int, int> pairs;

int main()
{
   auto compare = [](pairs lhs, pairs rhs) //custom compare lambda function
   {
      if(lhs.first > lhs.second ) lhs = pairs{lhs.second, lhs.first };
      if(rhs.first > rhs.second ) rhs = pairs{rhs.second, rhs.first };
      return lhs< rhs;
   };

   std::set<pairs, decltype(compare)> Set(compare);

   Set.emplace(std::make_pair(0,1)); // use can also emplace to the Set
   Set.emplace(pairs{0,2});
   Set.emplace(pairs{1,0});

   for(const auto& it: Set)
      std::cout << it.first << " " << it.second << std::endl;
}
0 1
0 2