我正试图在{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?
答案 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