我输入的数据如下,
//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,我认为这不是一个好的实践,因为data
和data_1
的目的不明确。虽然添加另一个struct可能会引入更大的文件因此,我很困惑是否要使用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) {}
};