如何使用set实现无序数据结构?

How to implement an unordered data structure using set?

本文关键字:数据结构 无序 实现 何使用 set      更新时间:2023-10-16

我想为我的 Face 结构构建一个无序集合,即

class myFace
{
public:
//the three points
int u;
int v;
int k;
myFace() = default;
myFace(int u, int v, int k) : u(u), v(v), k(k) {}
bool operator< (const myFace& e) const
{
bool result = true;
min(u, v, k);
if ((u == e.u && v == e.v && k == e.k) ||
(u == e.u && v == e.k && k == e.v) ||
(u == e.v && v == e.u && k == e.k) ||
(u == e.v && v == e.k && k == e.u) ||
(u == e.k && v == e.u && k == e.v) ||
(u == e.k && v == e.v && k == e.u))
{
result = false;
}
return result;
}
};

我想确保:

set<myFace> con;
myFace f1(1,2,3);
myFace f2(2,3,1);
myFace f3(3,1,2);
con.insert(f1);
con.insert(f2);
con.insert(f3);
cout << con.size() << endl;

输出应为 1。 由于 f1,f2,f3 是相同的。

或者我们可以说如何实现 3 个无序元素的集合,即 123,132,213,231,312,321 都是相同的。

秘诀是,为您的类使用正确的比较器并将其提供给集合。我在这里对集合使用了类似的方法。

我调整了这个解决方案并创建了以下示例代码:

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
struct myFace
{
//the three points
int u;
int v;
int k;
myFace() = default;
myFace(int u, int v, int k) : u(u), v(v), k(k) {}
};

struct Comparator {
bool operator () (const myFace& lhs, const myFace& rhs) const {
// Convert the structs to vectors
std::vector<int> v1 = { lhs.u, lhs.v, lhs.k };
std::vector<int> v2 = { rhs.u, rhs.v, rhs.k };
// Sort them 
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
// Compare them
return v1 < v2;
}
};
int main() {
std::set<myFace, Comparator> con;
myFace f1(1, 2, 3);
myFace f2(2, 3, 1);
myFace f3(3, 1, 2);
con.insert(f1);
con.insert(f2);
con.insert(f3);
std::cout << con.size() << std::endl;
return 0;
}

我发现 use set 可以实现目标:为 3 个无序元素实现一个集合,即 123,132,213,231,312,321 都是相同的。

set<int> face;
face.insert(1);
face.insert(2);
face.insert(3);
set<int> face2;
face2.insert(2);
face2.insert(1);
face2.insert(3);
set<int> face3;
face3.insert(3);
face3.insert(1);
face3.insert(2);
set<set<int>> faces;
faces.insert(face);
faces.insert(face2);
faces.insert(face3);
cout << "----" << endl;
cout << faces.size() << endl;