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()
将“提示”使用myread\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()
将“提示”使用myread\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()
吓坏了,因为它不知道如何使用
操作符进行比较,这是比较我的用户定义集时比较的必要条件。