C++ std::set。自定义集合

C++ std::set。自定义集合,c++,compare,functor,stdset,equivalence,C++,Compare,Functor,Stdset,Equivalence,字 我有一个结构,其中包含一个字段,我希望将其设置为用于比较和等效,以及其他字段作为元数据: struct read_tag{ unsigned int read_id; // want std::set to use this int offset; // metadata bool orientation; // metadata }; 我有一个函子来做这项工作: struct read_tag_compare { bool op

我有一个结构,其中包含一个字段,我希望将其设置为用于比较和等效,以及其他字段作为元数据:

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块;
到目前为止,一切都很顺利。问题如下:

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

std::set< std::set<read_tag, read_tag_compare> > blocks;
blocks.insert(a_block); // comp error
std::set块;
块。插入(a_块);//补偿误差
但这给了我一个很大的,难以解释的错误

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

比如说

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


非常感谢您的任何帮助:使用我的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;
结构读取标签{
unsigned int read_id;//希望std::set使用此
int offset;//元数据
bool-orientation;//元数据
};
结构读取\标记\比较{
布尔运算符(){
返回a.read\u id>b.read\u id;
}
};
结构读取\u比较{
布尔运算符()(常数集&a、常数集&b)常数{
返回true;
}
};
int main()
{
设置块;
设置块;
块。插入(块)
}

上面是我编译的东西。

它用我的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;
结构读取标签{
unsigned int read_id;//希望std::set使用此
int offset;//元数据
bool-orientation;//元数据
};
结构读取\标记\比较{
布尔运算符(){
返回a.read\u id>b.read\u id;
}
};
结构读取\u比较{
布尔运算符()(常数集&a、常数集&b)常数{
返回true;
}
};
int main()
{
设置块;
设置块;
块。插入(块)
}


上面是我编译的。

否,因为我只希望
块中有一个
std::set
,由等价性定义。我不在乎这两个集合中的元数据是否不等价。因为如果两个集合包含所有相同的
read\u标记
s,就
read\u标记而言。read\u id
元数据在数字意义上是不等价的,但以后可以派生相同的信息。因此,我可以选择这两个集合中的任何一个,但我不想要两者都没有,因为我只想要由等价性定义的
块中的一个
std::set
。我不在乎这两个集合中的元数据是否不等价。因为如果两个集合包含所有相同的
read\u标记
s,就
read\u标记而言。read\u id
元数据在数字意义上是不等价的,但以后可以派生相同的信息。所以我可以拿两套中的任何一套,但我不想要两套,你真的是人间的神。非常感谢!因此,
a.key\u comp()
将“提示”使用my
read\u tag\u compare
functor来执行两个
std::set
s之间的比较?您很好地解释了使用用户定义自定义谓词的问题。可能无法比较的类型;而不是削减它,因为它太含糊不清像“鞋”之前,他害怕了向下的投票…哦SO@izaak_pyzaak:我们使用的是另一个重载
词典编纂的\u compare
,即接受谓词的重载。我随机选择了两个可能的比较器(
a.key\u comp()
b.key\u comp()
)中的一个,因为在你的特殊情况下,它们是可互换的(它们是无状态的)。先生,你真的是人间之神。非常感谢!因此,
a.key\u comp()
将“提示”使用my
read\u tag\u compare
functor来执行两个
std::set
s之间的比较?您很好地解释了使用用户定义自定义谓词的问题。可能无法比较的类型;而不是削减它,因为它太含糊不清像“鞋”之前,他害怕了向下的投票…哦SO@izaak_pyzaak:我们使用的是另一个重载
词典编纂的\u compare
,即接受谓词的重载。我随机选择了两个可能的比较器(
a.key\u comp()
b.key\u comp()
)中的一个,因为在您的特定情况下,它们是可互换的(它们是无状态的)。我只是复制并粘贴了您的代码。它编译得很好,没有错误。我如何向您展示..?事实上,是的,这是编译的,是blocks.insert()出错。您刚才添加了insert吗?结论:您必须设计一些方法来比较两个集合。您的简单的
read\u compare
工作正常,因为它实际上不比较任何内容。只是回到了现实。检查已接受的答案
set::insert()
吓坏了,因为它不知道如何使用
操作符进行比较,这是比较我的用户定义集的必要条件。我只是复制并粘贴了您的代码。它编译得很好,没有错误。我如何向您展示..?事实上,是的,这是编译的,是blocks.insert()出错。您刚才添加了insert吗?结论:您必须设计一些方法来比较两个集合。您的简单的
read\u compare
工作正常,因为它实际上不比较任何内容。只是回到了现实。检查已接受的答案<代码>集::insert()
吓坏了,因为它不知道如何使用
操作符进行比较,这是比较我的用户定义集时比较的必要条件。