我正在尝试将几对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)
我想拥有
(0,1), (0,2)
如何避免重复?有什么办法吗?与 'set' 相比,在效率方面是否有更好的 ADT,例如 std::unordered_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();
}
输出:
2
关于c++ - 如何将不同的对添加到集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013008/