std::set。定制套组

std::set. Custom set of sets

单词。

我有一个结构,包含一个我想设置用于比较和等价的字段,以及其他字段作为元数据:

struct read_tag{
    unsigned int read_id; // want std::set to use this
    int offset;           // metadata
    bool orientation;     // metadata
};

我有一个仿函数来完成这项工作:

struct read_tag_compare {
    bool operator() (const read_tag &a, const read_tag &b) const {
        return a.read_id > b.read_id
    }
};

并声明。所需的设置为

std::set<read_tag, read_tag_compare> block;

到目前为止一切都可以编译。问题如下:

如何制作包含 std::set<read_tag, read_tag_compare> 的集合。我想要这样的东西:

std::set< std::set<read_tag, read_tag_compare> > blocks;
blocks.insert(a_block); // comp error

但这给了我一个非常大且难以破译的错误。

我认为它会递归地检查内部集合的比较方式并将其扩展到外部集合。所要做的就是为最内层的集合定义比较器。

例如

std::set<std:set<unsigned int>> set_o_sets;

工作正常,无需我定义如何比较 std::set<unsigned int>

非常感谢任何帮助:D

用我的 g++-5.3.1 编译没有错误 ubuntu..

#include<set>
#include<iostream>
using namespace std;

struct read_tag{
    unsigned int read_id; // want std::set to use this
    int offset;           // metadata
    bool orientation;     // metadata
};
struct read_tag_compare {
    bool operator() (const read_tag &a, const read_tag &b) const {
        return a.read_id > b.read_id;
    }
};
struct read_compare {
bool operator() (const set<read_tag, read_tag_compare> &a, const     set<read_tag, read_tag_compare> &b) const {
    return true;
}
};

int main()
{
    set<read_tag, read_tag_compare> block;
    set<set<read_tag, read_tag_compare>, read_compare> blocks;
    blocks.insert(block)
}

以上是我整理的

std::set 上的 < 比较使用没有比较器的 std::lexicographical_compare,即它只是转发到元素类型上的 <。 (这是标准库的一个限制,因为这是为所有容器定义的,而不仅仅是有序关联的容器。)所以你需要的是一个自定义比较器,用于使用正确的字典序比较重载的集合集合:

using read_tag_set = std::set<read_tag, read_tag_compare>;

struct read_tag_set_compare {
    bool operator()(const read_tag_set &a, const read_tag_set &b) const noexcept {
        return std::lexicographical_compare(a.begin(), a.end(),
                                            b.begin(), b.end(), a.key_comp());
        //                                                      ^^^^^^^^^^^^
    }
};

现在使用:std::set<read_tag_set, read_tag_set_compare>


代码显示了为什么有序关联容器没有明显的 "fix" 可以做到这一点 "just work":如果容器使用自定义的、有状态的谓词,那么通常不能保证两个不同容器的成员实际上完全可以相互比较。您所知道的是,within 一个容器中的元素可以与该容器的比较器进行比较。因此,当您使用自定义比较器时,最好还明确说明两个不同容器之间的关系,并明确断言比较两个容器是有意义的。