我可以将一类的属性分组到一张地图中吗?

时间:2019-06-12 12:23:16

标签: c++ variables maps

如果我有“节点”类,并希望包括所有可能的(例如int)属性。将它们分组到一个地图中是一个好的解决方案。 因此,相反:

    class node{
        int color;
        int isVisited;
        int weight;
    public:
    };

拥有

    class node{
        map<string, int> property;
    public:
       setProperty(string property_label, int property_value) 
        {property[propery_label] = property_value;};

    };

    int main(){
        node n;
        n.setProperty("color",int(color::red));
        n.setProperty("isVisited", 1);
        n.setProperty("weight", 12);
    }

编辑: 这样做的原因是,在变换图形时,在算法中间需要某个局部属性(例如在遍历过程中被访问或被标记),但是这些局部属性并不表示a的固有属性。节点,并且在输出中不需要。另外,有时我需要多个“ isVisited”变量。

另一个原因是保持类“节点”的通用性并为最终可能需要的新属性打开。

2 个答案:

答案 0 :(得分:3)

您给出的示例给人的印象是 any 节点将具有您提供的 all 属性(colourisVisited,{{1 }})。如果是这样,通常最好保留开始时使用的原始课程。

在某些情况下,地图(或更可能是weight)可能会更好。只是几个例子:

  • 您有大量的可能(但预定义)属性,每个节点仅需要其中的一小部分。枚举可能更适合作为键。
  • 您要/需要存储在编译时未知的任意属性。
  • 每个节点具有相同的属性,但是您主要是通过用户输入来访问它们的;那么特别是std::unordered_map可能比(可能很长)if-else链更快。​​

最后,一切都取决于用例...

对于字符串作为键,trie也可能是一个有趣的选择。

答案 1 :(得分:0)

class(与struct相同,除了它默认为private访问而不是public)主要是将数据和/或功能元素组合在一起。 / p>

node似乎只是将三个元素组合在一起。因此,您可能想从以下简单的内容开始:

struct node // access is public by default
{
    int color;
    int isVisited;  // maybe a bool rather than int?
    int weight;
}
...
node myNode;
myNode.color = ...
...
std::cout << myNode.weight;