【问题标题】:Working with a secondary datastructure// Advice for data structure使用辅助数据结构// 数据结构建议
【发布时间】:2016-03-17 22:20:52
【问题描述】:

我正在尝试基于已经存在的数据结构(我无法修改并且它本身不是图形)构建一个图形数据结构。 我想我对如何构建与图形本身有关的大部分结构有所了解,但现在我必须参考原始数据结构来获取一个小的“比较”功能,并且很难对其建模妥妥的……

我的顶点代表原始数据结构的两个不同的类 A 和 B,它们具有不同的成员变量并且没有共同的祖先。对于算法,我必须检查两个顶点是否兼容。 规则是:A-Vertex 和 B-Vertex 总是不兼容的,但是如果两个顶点代表相同的类型,我必须检查各自类型的一些细节。 所以基本思路大致是这样的:

bool isCompatible(const Vertex& other){
  // if this->data is of other type than other->data
  //    return false;
  // else return compareFunction(this->data, other->data)
       // where maybe one could overload that compare-function 
       // or make a template out of it
}

但我真的不知道如何存储对数据的引用而不使其变得非常丑陋。

想法 1) 对数据使用 void 指针,有一些变量来存储类型,然后将 void 指针转换为相应的类型
-> 可能会起作用,但看起来非常危险(类型安全?)而且非常丑陋(如果您想在其他数据上使用 Graph 结构,基本上没有可重用性)。看起来有点像蛮力方法。

想法 2) 创建一个抽象数据类,提供一些“isCompatible(data)”函数,并分别为 A 和 B 提供封装类,它们从抽象类继承并覆盖该函数。在被覆盖的函数内部,可以使用 dynamic_cast 然后比较对象。
-> 看起来仍然不是很好的设计,但应该也可以吗?

想法 3) 使模板工作?这是我第一次使用 C++,所以我在正确解决这个问题时遇到了一些问题。 我认为以下内容应该可以进行比较:

template<typename T1, typename T2>
bool compare(T1 object1, T2 object2){
    return false;
}

然后有 (A,A) 和 (B,B) 的实例覆盖它。对我来说,这似乎是比较本身的方式。但是我真的不知道如何在不丢失类型的情况下管理从顶点到对象的引用。有什么建议吗?

当然,我也愿意接受任何其他建议。

编辑:如果相关的话,我正在使用 C++11。

【问题讨论】:

    标签: c++ data-structures


    【解决方案1】:

    如果您的数据是 AB,而这两种类型没有任何共同之处,那么听起来您想要的是 variant 数据类型。 C++ 标准库还没有,但你可以使用Boost's

    boost::variant<A, B> data;
    

    变体为您提供类型安全(void* 没有),并且不需要您在两种类型之间有一个共同的祖先(这在概念上显然是不相关的)。

    使用上述变体,您可以使用binary visitation 进行比较:

    bool isCompatible(const Vertex& other) {
        boost::apply_visitor(is_compatible(), data, other.data);
    }
    

    与:

    class is_compatible
        : public boost::static_visitor<bool>
    {
    public:
    
        template <typename T, typename U>
        bool operator()( const T &, const U & ) const
        {
            return false; // cannot compare different types
        }
    
        bool operator()( const A& lhs, const A& rhs ) const
        {
            // whatever A-specific comparison
        }
    
        bool operator()( const B& lhs, const B& rhs ) const
        {
            // whatever B-specific comparison
        }    
    };
    

    【讨论】:

    • 非常感谢!嗯,如果“数据”字段是私有的,您如何建议将数据断言到该字段?将变体对象直接传递给类(会向外部显示内部工作原理)或分别为 A 和 B 设置一个设置器或不同的东西?
    • @Maike 它是私人的没关系。 isCompatible是一个成员函数,你可以访问它。
    • 我更多地考虑如何将我的对象作为一个整体进行初始化。因此,当我制作 Vertex 时,我应该有一个像 Vertex(boost::variant&lt;A, B&gt;) 这样的构造函数,还是应该制作不同的构造函数 Vertex(A)Vertex(B) 来隐藏变体......似乎是一个愚蠢的问题,但我仍在弄清楚如何我猜要正确使用它..
    • @Maike 可能是后者。
    猜你喜欢
    • 2016-05-21
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多