2011-05-03 64 views
0

我正在使用連續方法開展與電路測試相關的小型科學課程項目。該程序將解析電路定義文件,然後構建一個易於修改的圖形結構來表示電路。然後對該圖進行某些修改,並對其進行拓撲排序。排序後,圖形轉換爲一個由數組列表構成的靜態結構,每個數組對應一定的拓撲排序程度。之後,可以很容易地模擬電路,因爲您可以依賴排序順序並按順序處理模型。創建自定義圖形數據結構是否違反任何原則?

現在是所有好的和邏輯,但我所提到的兩個圖是自定義的數據結構,其中:

1)不建挺到STL規範(是漫長和艱難的,我反正 - 圖比向量和列表複雜得多)

2)對於第二個圖,我假設它是不可修改的,並使用矢量向量或向量列表來獲得速度。

3)我的圖表可用的一組操作是有限的,反映了我的項目需求。

4)代碼很簡單。

現在我只是一個三年級學生的IT和軟件設計和閱讀一些現實生活中的代碼後,成就了一個療程後,我在想:

1)能夠(或者甚至可能)的代碼如此簡單?

2)不要因爲假設數據結構而違反軟件設計的數以千計的原則嗎?

3)我應該真的總是符合我在這個和未來的項目中創建的所有數據結構的STL規範嗎?

該項目使用C++。

感謝您的關注!我希望對這些問題有一個基本的和理論上的答案,以及這個問題的實際解決方案的例子。

+0

請不要給這個作業標籤。恭敬謝謝。 – iksemyonov 2011-05-03 14:10:41

+1

你如何表示第一個圖?鄰接列表或類似結構可以用標準容器構建。你還看看boost :: graph數據結構嗎? – 2011-05-03 14:13:15

+0

IIRC它就像頂點列表和邊緣列表,邊緣知道它們連接的頂點。所以你可以快速插入/刪除數據。是的,我瞭解Boost,但由於這是一個大學項目,我的目標是證明我可以編寫代碼,而不是使用已有的解決方案。如果我選擇使用Boost :: Graph和其他庫,那麼我的代碼會很少。 – iksemyonov 2011-05-03 14:44:42

回答

5

1)可以(甚至可以)代碼簡單嗎?

不僅可以,它應該是。代碼不需要很複雜。

2)不要因爲假設數據結構而違反數以千計的軟件設計原則嗎?

恩,你會怎麼做。這個問題對我沒有意義。

3)我應該真的總是遵從STL規範來說明我在這個和未來的項目中創建的所有數據結構嗎?

沒有。例如,如果您不需要迭代結構,則不要提供迭代器。只實現你實際需要的東西。

+0

那麼我的不好,在第2點)我主要是指代碼應該更通用,更少定製,或類似的東西,我們在學校教過的想法。 – iksemyonov 2011-05-03 14:46:24

+0

@Semen設計真正的通用代碼非常非常困難。即使是C++標準庫也需要花費數年時間才能達到目前的狀態(仍然不太理想)。您應該設計自己的代碼,以正確,明確地滿足您當前的要求。 – 2011-05-03 14:49:25

1

我認爲沒有錯用一個簡單的設計是這樣的:

typedef int node_type; // or a more complex type here 
typedef std::list<node_type> node_list; 
typedef std::pair<node_list::const_iterator, node_list::const_iterator> edge_type; 
typedef std::list<edge_type> edge_list; 

struct graph 
{ 
    node_list nodes; 
    edge_list edges; 

    // Some member functions for doing specific things here 
    // for instance: 
    void remove_node(node_list::iterator i) 
    { 
     nodes.erase(i); 
     edges.remove_if(connects(i)); 
    } 
}; 

其中

struct connects 
{ 
    connects(node_list::const_iterator i) : i(i) {} 

    bool operator()(const edge_type& e) const 
    { 
     return e.first == i || e.second == i; 
    } 

private: 
    node_list::const_iterator i; 
}; 

它保持簡單,模塊化,並允許您使用標準庫就可以了。它允許你迭代節點和邊。如果你想要一個頂點的鄰接列表,你將不得不遍歷整個邊界列表,但這是設計的(如果你想快速完成這個,你需要一個更好的結構)。

例如,定義(這個人是不幸的是沒有標準)

template <typename I, typename F, typename G> 
F for_each_if(I first, I last, F f, G pred) 
{ 
    for (; first!=last; ++first) if (pred(*first)) f(*first); 
    return f; 
} 

,現在你可以做

for_each_if(g.edges.begin(), g.edges.end(), something, connects(some_node)); 

遍歷的some_node鄰接表。

使用C++ 0x有更優雅的方法來編碼這些算法(使用lambdas)。

+0

雖然這個設計看起來不是那麼快,但它展示了一種不同的主題。我想我需要學習更多的C++ 0x和STL。我還沒有習慣於功能風格的編碼。 – iksemyonov 2011-05-04 10:49:16

+0

@Semen:的確,這樣的方法使您能夠爲您的應用程序利用STL算法。然而,你很快就會意識到,STL算法真的很吸引,沒有lambda函數。如果你有權訪問C++ 0x編譯器,那麼可以隨意使用這種方法。否則,對於一個簡單的項目來說這可能太麻煩了。 – 2011-05-04 11:35:35

+0

這很巧妙!切換到C++ 0x對我的工作來說可能是一個很好的獎勵,雖然我沒有時間學習這個新技術。順便說一下,它還沒有標準化,請問你指點我一個體面的語言/ STL實施?請問G ++ 4.x分支是否工作? – iksemyonov 2011-05-04 14:05:51

相關問題