2016-06-12 73 views
0

我輸入數據如下圖所示,更好的命名約定或更好的結構/類嗎?

//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的目的不明確。雖然添加另一個結構可能會引入較大的文件因此,我很困惑是否要制定2個結構來區分這些輸入類型,從而導致更好的命名約定。有什麼建議?

+0

我們需要對在什麼樣的價值觀更多信息文件實際上應該是_mean_。無論如何,'data'和'data_1'都是無用的名字。如果文件行應該表示圖形邊緣,那麼像'source'和'target'這樣的東西呢? – mindriot

+1

從寫清楚,可維護的代碼開始。然後當你完成配置文件,並看看你是否需要從那裏改變的東西。您會驚訝於編譯器可以使用良好且易於理解的代碼進行編碼的優化量。 – NathanOliver

+0

@NathanOliver'編譯器可以用良好的,易於理解的代碼進行優化的優化量你能舉一個例子嗎?在這裏不太明白 –

回答

3

添加另一個結構可能會引入更大的文件。

如果這有助於可讀性,這是一個很好的折衷。增加另一個struct以提高可讀性不會增加編譯程序的大小。

struct s主要是編譯時工件。編譯器使用它們來了解大小和字段偏移量。除非您的struct附帶虛擬成員函數,否則添加新的struct不會增加程序的運行時間佔用空間。如果您的struct完全不相關,則不會將內存或CPU分開處理。

當您struct s的關係,不過,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) {} 
}; 
+0

謝謝。但在我的情況下,後者的輸入類型不是'from'和'to',而更像'type'和'city_id',查看更新的問題。所以你上面的代碼不適合我的需要。不過,謝謝你的建議。 –

+0

@Bla ...請參閱編輯。 – dasblinkenlight

1

我覺得這是一個非常明確的情況:您正在從文件中讀取兩個非常不同的元組。第一個列表包含圖邊緣與源和目標索引,而第二個列表包含城市與類型和ID。

您應該首先關注代碼的可讀性,可理解性和可維護性。編譯器將能夠優化大量;從您想要的那種過早優化中獲得任何東西是相當不可能的。所以,以下@ 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) {} 
};