C ++设置唯一和顺序

时间:2017-09-23 15:21:09

标签: c++ sorting set compare unique

我想在set<Foo, FooComp>中制作独特的订单。

在下面的代码中,我想要一个唯一的,并按b和c排序。 因此,foo.afoo.b之间没有相同的foo.c和订单。

我该怎么做?

struct Foo {
    int a, b, c;
    Foo(int a, int b, int c) : a(a), b(b), c(c) {}
}

struct FooComp {
    bool operator() (const Foo& f, const Foo& s) const {
        if (f.pattern == s.pattern) {
            return false;
        }
        if (f.start == s.start) {
            return f.length < s.length;
        }
        return f.start < s.start;
    }
}

还是我使用其他STL或数据结构?

2 个答案:

答案 0 :(得分:0)

使用标准库集无法实现这一点。

比较运算符与排序紧密结合。

虽然性能方面的解决方案稍差,但您可以拥有一个包含所有对象的集合,仅使用“a”排序:

struct Foo {
    int a, b, c;
    Foo(int a, int b, int c) : a(a), b(b), c(c) {}
    bool operator<(const Foo& rhs) const {
        return a < rhs.a;
    }
    friend ostream& operator<<(ostream&, const Foo&);
};

然后,只要您想使用您的独特算法对其进行排序,只需将其复制到矢量中并根据您的需要对其进行排序:

vector<Foo> v;
std::copy(s.begin(), s.end(), std::back_inserter(v));
std::sort(v.begin(), v.end(), [](const Foo& lhs, const Foo& rhs){ return (lhs.b == rhs.b) ? lhs.c > rhs.c : lhs.b > rhs.b; });

<强>被修改

这实现了您在Pastebin示例中使用的逻辑。 整个示例here

答案 1 :(得分:0)

有一个现成的库,可以在boost中使用名为boost.multi_index的这种东西。

它允许声明满足多个索引及其约束的容器。

这有点陈旧,可以做一些爱,但它可以做到这一点。

你可以从这样的事情开始:

struct Foo {
    int a, b, c;
    Foo(int a, int b, int c) : a(a), b(b), c(c) {}
};

#include <tuple>
#include <type_traits>
#include <utility>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>


struct get_a
{
    using result_type = int const&;
    result_type operator()(Foo const& l) const {
        return l.a;
    }
};

struct get_bc
{
    using result_type = std::tuple<int const&, int const&>;

    result_type operator()(Foo const& l) const {
        return std::tie(l.b, l.c);
    }
};

namespace foo {
    using namespace boost;
    using namespace boost::multi_index;

    struct by_a {};
    struct by_bc {};

    using FooContainer = 
multi_index_container
<
    Foo,
    indexed_by
    <
        ordered_unique<tag<by_a>, get_a>,
        ordered_non_unique<tag<by_bc>, get_bc>
    >
>;
}

int main()
{
    foo::FooContainer foos;

    foos.insert(Foo{ 1, 2,3 });
    foos.insert(Foo{ 2, 2,4 });

}