我来自一个功能相当的编程背景,我不习惯(高效)C ++数据结构。我需要一个数据结构来保存struct element
中描述的多个元素。在集合中,字段id应该是唯一的。
我想在集理论中执行非常快速的集合比较,例如在比较集{x1,x2,x3}
和{x4,x5}
时,我想确定交集{x5}
(或{{ 1}}在这种情况下相等)和其他集合的子集等,例如{x2}
。
在C ++世界中是否存在......“设置理论”数据结构?
{x1,x2,x3} \ {x5} = {x1,x3}
答案 0 :(得分:5)
有std::set
,它实现了动态集(动态意味着可以插入或删除元素)。要使其与element
结构一起使用,您需要一个仅查看id
的自定义比较函数。或者,您可以使用std::map<int, float>
,这可能更适合您的问题。
要查找两个集合的交集,请使用std::set_intersection
算法。这需要排序范围,其中包括std::set
或std::map
的迭代器范围。如有不同之处,请使用std::set_difference
。
答案 1 :(得分:1)
只是想提一下,因为在处理集合时有一个非常好的数据结构,但它不能满足您的所有需求,
但是如果你有类似的要求,你仍然可以记住它,
1)查询元素所属的集合
2)不同集合的联盟
两者都在亚对数时间内,即几乎恒定。它叫做Disjoint set Data structure http://en.wikipedia.org/wiki/Disjoint-set_data_structure
答案 2 :(得分:1)
struct element {
int id;
float value;
element(int id_=0, float value_=0.0) : id(id_), value(value_) {}
bool& operator==(const element& e) const
{
return id==e.id && value==e.value;
}
};
element e1(1,1.0);
std::set<element> set_;
set_.insert(e1);
Checkout std算法,用于您可以执行的操作。 http://www.cplusplus.com/reference/algorithm/