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

时间:2018-06-24 18:54:09

标签: c++ algorithm c++11 compare stdset

我正试图在{em> set 中插入几对$("#emailSubmit").click( function () { if ($('#bodyE').val() == '' ) { errorMessage +="Body"; } if ($('#subject').val() == '') { errorMessage += "Subject"; } if($('#email').val() == '') { errorMessage += "Email Adress"; } else { if (pattern.test($('#email').val()) == false) { errorMessage += "Email not valid!"; } } }); $("#emailSubmit").click( function () { if (errorMessage != "") { var html = $('<div class="alert alert-danger alert-dismissible" id="errorAlert">' + errorMessage + '</div>'); $('body').prepend(html); } }); ,这些对没有任何顺序;即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) , (1,0)

如何避免重复?有什么办法吗?与'set'相比,在效率方面是否有像(0,1), (0,2) 这样更好的ADT?

2 个答案:

答案 0 :(得分:2)

您将需要一个自定义比较功能。在该处,请确保在进行比较时,成对的元素的顺序无关紧要。一种简单的方法是让该对中的第一个元素始终是较小的(否则交换第一个和第二个)。

代码可能如下所示:

[m]

输出:

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();
}

答案 1 :(得分:1)

使用std::set作为模板类型时,std::pair需要custom compare function。在C ++ 11中,您也可以将其设置为lambda。

compare函数的思想是首先检查Pair是否为Pair.first < Pair.second,如果不是,则在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;
   };

类似这样的内容:See live here

#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