我正在使用std::set<T>
,其中T是我自己的课。是否有一种方法可以使一个集合始终按我的类的属性A排序,并且仍然使所有元素在我类中的属性B方面保持唯一。
class T
{
public:
int A;
int B;
}
因此,我需要将类实例按A排序,并按B唯一。只要std :: set是STL的一部分,也可以接受它的任何替代方法。
#include <iostream>
#include <set>
class Foo { // Your T
public:
int A;
int B;
Foo(int a, int b) : A(a), B(b) { }
};
template <typename T, typename Comparison>
void addToSet(std::set<T, Comparison>& s, Foo item)
{
for (auto i : s) {
if (i.B == item.B) {
// Do whatever you need here, currently item is not added.
return;
}
}
s.insert(item);
}
int main()
{
auto comp = [](Foo a, Foo b) { return a.A < b.A; };
std::set<Foo, decltype(comp)> sortedSet(comp);
auto quickAdd = [&sortedSet](Foo item) mutable { addToSet(sortedSet, item); };
quickAdd(Foo(1, 2));
quickAdd(Foo(5, 2)); // Shouldn't be seen
quickAdd(Foo(5, 5));
for (auto i : sortedSet)
std::cout << "A: " << i.A << ", B: " << i.B << '\n';
}
此输出
A: 1, B: 2
A: 5, B: 5
应该符合您的条件。
某些注释,由于对不添加具有匹配的B键的项目的特定要求,我将Foo类型硬编码到addToSet函数中。 main中的quickAdd
lambda只是这样,我不必总是键入sortedSet
作为第一个参数。您自然可以修改comp
函数以获取所需的任何行为,例如按B键对匹配的A键进行排序,或将A键从高到低排序。