设定理论数据结构

时间:2011-12-10 19:31:19

标签: c++ data-structures set-theory

我来自一个功能相当的编程背景,我不习惯(高效)C ++数据结构。我需要一个数据结构来保存struct element中描述的多个元素。在集合中,字段id应该是唯一的。

我想在集理论中执行非常快速的集合比较,例如在比较集{x1,x2,x3}{x4,x5}时,我想确定交集{x5}(或{{ 1}}在这种情况下相等)和其他集合的子集等,例如{x2}

在C ++世界中是否存在......“设置理论”数据结构?

{x1,x2,x3} \ {x5} = {x1,x3}

3 个答案:

答案 0 :(得分:5)

std::set,它实现了动态集(动态意味着可以插入或删除元素)。要使其与element结构一起使用,您需要一个仅查看id的自定义比较函数。或者,您可以使用std::map<int, float>,这可能更适合您的问题。

要查找两个集合的交集,请使用std::set_intersection算法。这需要排序范围,其中包括std::setstd::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/