更多结构/类以获得更好的命名约定?

时间:2016-06-12 13:08:51

标签: c++ struct naming-conventions

我输入的数据如下,

//road graph: from and to
1 2
1 3
3 4
3 5
//next festive city: type and city_id
2 5
2 3
1 3
2 3
2 4

到目前为止,我创建了1个结构来表示两种输入类型。

struct MainData{
    int data;
    int data_1;
};

int main()
{
    /*code omitted*/
    for(int i=0;i<n-1;i++){
        cin>> highWays[i].data >> highWays[i].data_1;
    }
    for(i=0;i<m;i++)
    {
        cin>>queries[i].data>>queries[i].data_1;
    }
    /*code omitted*/
}

IMO,我认为这不是一个好的实践,因为datadata_1的目的不明确。虽然添加另一个struct可能会引入更大的文件因此,我很困惑是否要使用2个结构来区分这些输入类型,从而导致更好的命名约定。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

  

添加另一个结构可能会引入更大的文件。

如果这有助于提高可读性,那么这是一个非常好的权衡。添加另一个struct以提高可读性并不会增加已编译程序的大小。

struct主要是编译时工件。编译器使用它们来了解大小和字段偏移。除非您的struct附带虚拟成员函数,否则添加新的struct不会增加程序的运行时间。如果struct完全不相关,则将它们分离出来不会造成内存或CPU损失。

当您的struct相关时,C ++可以让您充分利用这两个方面:创建基类,从中派生,并为成员函数提供描述性名称:

class GraphEdge {
protected:
    int from;
    int to;
    GraphEdge(int f, int t) : from(f), to(t) {}
};

struct RoadEdge : public GraphEdge {
    int fromRoad() { return from; }
    int toRoad() { return to; }
    RoadEdge(int f, int t) : GraphEdge(f, t) {}
};

struct CityEdge : public GraphEdge {
    int fromCity() { return from; }
    int toCity() { return to; }
    CityEdge(int f, int t) : GraphEdge(f, t) {}
};

答案 1 :(得分:1)

我认为这是一个非常明确的案例:您正在从文件中读取两个非常不同的元组。第一个列表包含带有源索引和目标索引的图形边,而第二个列表包含带有类型和ID的 cities

首先,您应该担心代码的可读性,可理解性和可维护性。编译器将能够充分优化;你不太可能从你想到的那种过早优化中获得任何东西。所以,按照@dasblinkenlight的好答案(他在你启发我们关于数据结构的目的之前写的),我会推荐两种不同的数据结构:

class GraphEdge {
protected:
    int from;
    int to;
    GraphEdge(int f, int t) : from(f), to(t) {}
};

class FestiveCity {
protected:
    int city_type; // This should probably be an enum
    int id;
    FestiveCity(int t, int i) : city_type(t), id(i) {}
};