2013-03-24 76 views
3

當您必須在C++中實現複雜的數據結構時,您採用什麼解決方案?我的意思是不同類型的對象應該被其他對象引用,同時引用其他對象。它與可用的標準庫容器非常不同。在C++中實現複雜的數據結構

你儘量讓你的代碼非常C++和使用泛型編程(集裝箱式的模板)?恕我直言,這似乎很難實施和不方便,它可以使代碼更難理解或合作。而且,你是否實現了任何一種迭代器?

或者,也許,在另一方面,你結束了「C代碼風格」?我的意思是,在每個類中實現一些指針作爲引用其他對象的成員變量,以便構建合適的數據結構。

根據你的經驗,什麼是這兩種方法的優點和缺點?其他解決方案?

+5

寫入C++代碼與C++。用C編寫C代碼。對於具有合理數量的經驗的C++開發人員來說,你描述的難以實現和不方便的事實際上是非常好的和可理解的。它只需要學習,耐心和練習。 – 2013-03-24 15:20:31

+0

沒有明確的答案。但在我看來,如果你有一個複雜的數據結構,那麼保持接口簡單和C++就好,然後如果實現是混亂的,C就像沒有人會關心,只要它被正確隱藏。 – john 2013-03-24 15:27:33

+0

您是否在談論實現自己的容器?這樣做的好處是什麼?假設數據結構遠不是一般的,只有在與自己的類一起使用時纔有意義。 – jbgs 2013-03-24 15:27:36

回答

1

有一對夫婦的,我在C++編寫複雜的數據結構時必須遵循以下原則:

  1. 避免原始指針;使用智能指針。
  2. 如果您的數據結構是循環數據或非循環數據,請儘早弄清楚。如果數據結構中存在週期,則無法在任何地方使用share_ptr而不會造成泄漏。在循環結構中的某一點,你想用weak_ptr來打破這個循環,以便釋放對象。
  3. 如果我的對象保存到其他對象,我希望它是一個容器,我實現了合適的迭代器當我需要他們,之前沒有一秒鐘。當我想在我的容器上使用其中一種STL算法時,我通常需要迭代器支持。當然,我可以實現與我自己使用的STL(命名或語義方面)不匹配的迭代器,但是之後我又添加了另一種方法在我的代碼中執行某些操作。我儘量避免這種情況。
  4. 如果我的類打算容納不同的類型,那麼我使用模板來表達它。有些方法可以在C中使用(使用memcpy等),但是最終得到的代碼對C編程人員來說會更容易理解,但是您將失去C++的大多數好處(類型安全性,賦值運算符等)。 )。
+0

謝謝!數據結構是循環的。我明白shared_ptr對象是如何非常有用的。但考慮到我必須處理許多不同類型的指針和循環結構,我將weak_ptr和shared_ptr視爲一團糟。我更喜歡照顧內存釋放。 – jbgs 2013-03-24 15:40:36

+0

我瞭解了weak_ptr和shared_ptr的可以被看作是一個爛攤子,但同時我搞砸了內存分配我自己很多次,shared_ptr的和的weak_ptr從來沒有把事情搞糟了我。 – razeh 2013-03-24 15:42:54

+0

關於4.容器僅用於容納我自己的物體。對於其他課程來說它沒有任何意義。這就是爲什麼我認爲通過成員指針(shared_ptr或raw)實現它是最直接的解決方案。 – jbgs 2013-03-24 15:54:02