C ++数据结构可存储两个唯一元素集之间的多个关系

1993年

我正在一个项目中,我有两个独特的元素集。一个集合中的任何元素都可以与另一集合中的任何元素相关。

例子:

集合1:{A,B,C}

集2:{1、2、3、4}

允许的关系:

(A,1)(A,3)

(B,1)(B,4)

(C,1)(C,3)(C,4)

单个关系表示为一对括号内的两个set元素。

在我的特定项目中,这两个集合的元素都是对象,并且我希望对存储的所有对象的所有引用都解析为一个对象(例如,所有包含A的关系都将引用同一个对象A,对于关系另一侧对其他集合的引用)。

我当时正在考虑使用Boostbimap解决这个问题。我正在研究用于bimap的左右两半以及这两个集合之间的关系的潜在集合类型,并一直在尝试确定哪些集合是正确的。

对于的左右两半bimap,我一直认为set_of CollectionType正确,因为我的两组对象是一组,而且我不希望我的任何元素重复bimap

但是,当我在实践中尝试此操作时,最终我无法在插入关系(A,1)之后插入关系(B,1),因为插入必须在左边的两个地方都有效并对其进行正确的看法。为了更正此问题,我将CollectionType两个半部的均更改multiset_of所有值均已正确插入,但这是否意味着我bimap现在具有原始集合元素的重复副本?

为了对此进行纠正,我开始研究更改的两半之间关系的集合类型bimap由于关系类型的集合类型默认为的左半部分,因此bimap我认为这multiset_of是不正确的,并将其指定为set_of但是,我不确定这是否可以解决我原来的问题,即从原始集中获得多个对象副本。

我真正需要做的就是查看集合2中与集合1中的元素相关的所有对象。Boostbimap对我来说是正确的路线吗?我选择了正确的集合和关系类型吗?顺便说一句,我试图自定义地图,以使其具有快速的搜索时间,而不必担心插入时间(删除和修改将永远不会发生,地图会被初始化,然后用于之后的查找)。我应该只编写自定义数据结构吗?

我完全同意杰里的回答。如果要对图形进行建模,请考虑使用例如邻接表,边列表或矩阵表示。

Paul的回答有点麻烦,下面是使用Boost Multi Index的示例:

生活在Coliru

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <boost/multi_index/ordered_index.hpp>

struct T1 {
    std::string name;
    bool operator<(T1 const& o) const { return name < o.name; }
};
struct T2 {
    int id;   
    bool operator<(T2 const& o) const { return id < o.id; }
};

namespace bmi = boost::multi_index;

struct Relation {
    T1 const* key1;
    T2 const* key2;

    std::string const& name() const { return key1->name; }
    int                id  () const { return key2->id;   }

    friend std::ostream& operator<<(std::ostream& os, Relation const& r) {
        return os << "(" << r.name() << ", " << r.id() << ")";
    }
};

using RelationTable = bmi::multi_index_container<Relation,
      bmi::indexed_by<
        bmi::ordered_unique<bmi::tag<struct by_composite>, 
            bmi::composite_key<Relation, 
                bmi::const_mem_fun<Relation, std::string const&, &Relation::name>,
                bmi::const_mem_fun<Relation, int, &Relation::id>
            >
        >
    > >;

#include <set>

int main() {
    using namespace std;
    set<T1> set1 { {"A"}, {"B"}, {"C"} };
    set<T2> set2 { {1}, {2}, {3}, {4} };

    // convenient data entry helpers
    auto lookup1 = [&set1](auto key) { return &*set1.find(T1{key}); }; // TODO error check?
    auto lookup2 = [&set2](auto key) { return &*set2.find(T2{key}); };
    auto relate  = [=](auto name, auto id) { return Relation { lookup1(name), lookup2(id) }; };
    // end helpers

    RelationTable relations {
        relate("A", 1), relate("A", 3),
        relate("B", 1), relate("B", 4),
        relate("C", 1), relate("C", 3), relate("C", 4),
    };

    for (auto& rel : relations)
        std::cout << rel << " ";
}

印刷

(A, 1) (A, 3) (B, 1) (B, 4) (C, 1) (C, 3) (C, 4) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++如何在两个不同的std :: lists中删除引用同一元素的指针?

来自分类Dev

Boost或C ++ 11中是否有一个充当队列但具有唯一元素的容器?

来自分类Dev

两个向量之间的唯一元素配对使总和最大化

来自分类Dev

如何在C ++中找到数组的最小和唯一元素?

来自分类Dev

自定义比较器可将唯一元素插入C ++中的集合

来自分类Dev

计算C中struct数组中的唯一元素

来自分类Dev

在 C# 中添加唯一元素并自动更新 ObservableCollection

来自分类Dev

分而治之-找到包含唯一元素的两个大小相等的数组之间的中位数?

来自分类Dev

合并两个数组,存储唯一元素,并在jQuery中排序

来自分类Dev

在两个数组之间查找唯一元素的更快算法?

来自分类Dev

Boost或C ++ 11中是否有充当队列但具有唯一元素的容器?

来自分类Dev

使用C ++中的std ::算法输出`std :: multiset`的唯一元素及其频率,输出(无循环)

来自分类Dev

在C ++中找到向量中每个索引处累积的唯一元素计数的有效方法

来自分类Dev

哪种c ++ stl数据结构对存储唯一值及其计数最有效?

来自分类Dev

在C#mongodb驱动程序中制作一个唯一元素数组

来自分类Dev

将重复出现的元素和唯一元素从给定数组中分离为两个包含唯一元素和重复元素的新数组

来自分类Dev

使用jquery .on()方法作用于同一元素(选项标签)的两个脚本之间的冲突

来自分类Dev

如何从Perl中的两个数组中获取唯一元素

来自分类Dev

如何从Perl中的两个数组中获取唯一元素

来自分类Dev

数据帧中非唯一元素的索引

来自分类Dev

Java数据结构,用于替换通过B值链接的两个地图Map <A,B>,Map <B,C>

来自分类Dev

使同一元素上的两个(或更多)变换协同工作

来自分类Dev

同一元素上的两个动画不起作用

来自分类Dev

如何在AngularJS的同一元素上嵌套两个指令?

来自分类Dev

在同一元素上使用两个Angular指令

来自分类Dev

同一元素上的两个动画不起作用

来自分类Dev

非唯一元素

来自分类Dev

C中这两个结构声明之间的区别

来自分类Dev

查找两个树结构之间的差异C#

Related 相关文章

  1. 1

    C ++如何在两个不同的std :: lists中删除引用同一元素的指针?

  2. 2

    Boost或C ++ 11中是否有一个充当队列但具有唯一元素的容器?

  3. 3

    两个向量之间的唯一元素配对使总和最大化

  4. 4

    如何在C ++中找到数组的最小和唯一元素?

  5. 5

    自定义比较器可将唯一元素插入C ++中的集合

  6. 6

    计算C中struct数组中的唯一元素

  7. 7

    在 C# 中添加唯一元素并自动更新 ObservableCollection

  8. 8

    分而治之-找到包含唯一元素的两个大小相等的数组之间的中位数?

  9. 9

    合并两个数组,存储唯一元素,并在jQuery中排序

  10. 10

    在两个数组之间查找唯一元素的更快算法?

  11. 11

    Boost或C ++ 11中是否有充当队列但具有唯一元素的容器?

  12. 12

    使用C ++中的std ::算法输出`std :: multiset`的唯一元素及其频率,输出(无循环)

  13. 13

    在C ++中找到向量中每个索引处累积的唯一元素计数的有效方法

  14. 14

    哪种c ++ stl数据结构对存储唯一值及其计数最有效?

  15. 15

    在C#mongodb驱动程序中制作一个唯一元素数组

  16. 16

    将重复出现的元素和唯一元素从给定数组中分离为两个包含唯一元素和重复元素的新数组

  17. 17

    使用jquery .on()方法作用于同一元素(选项标签)的两个脚本之间的冲突

  18. 18

    如何从Perl中的两个数组中获取唯一元素

  19. 19

    如何从Perl中的两个数组中获取唯一元素

  20. 20

    数据帧中非唯一元素的索引

  21. 21

    Java数据结构,用于替换通过B值链接的两个地图Map <A,B>,Map <B,C>

  22. 22

    使同一元素上的两个(或更多)变换协同工作

  23. 23

    同一元素上的两个动画不起作用

  24. 24

    如何在AngularJS的同一元素上嵌套两个指令?

  25. 25

    在同一元素上使用两个Angular指令

  26. 26

    同一元素上的两个动画不起作用

  27. 27

    非唯一元素

  28. 28

    C中这两个结构声明之间的区别

  29. 29

    查找两个树结构之间的差异C#

热门标签

归档