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 一个容器中的元素可以与该容器的比较器进行比较。因此,当您使用自定义比较器时,最好还明确说明两个不同容器之间的关系,并明确断言比较两个容器是有意义的。
单词。
我有一个结构,包含一个我想设置用于比较和等价的字段,以及其他字段作为元数据:
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 一个容器中的元素可以与该容器的比较器进行比较。因此,当您使用自定义比较器时,最好还明确说明两个不同容器之间的关系,并明确断言比较两个容器是有意义的。