C ++对象的排序集

问题描述 投票:1回答:1

我正在使用std::set<T>,其中T是我自己的课。是否有一种方法可以使一个集合始终按我的类的属性A排序,并且仍然使所有元素在我类中的属性B方面保持唯一。

class T
{
public:
    int A;
    int B;
}

因此,我需要将类实例按A排序,并按B唯一。只要std :: set是STL的一部分,也可以接受它的任何替代方法。

c++ algorithm sorting stl set
1个回答
0
投票
#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键从高到低排序。
© www.soinside.com 2019 - 2024. All rights reserved.