2013-04-18 41 views
2

我是STL的新手,想知道實現它的最佳方式: 我想用不同類型的元素來嵌套容器。我的想法是一個集合,其元素可能是矢量或地圖。不同類型的嵌套容器

這樣我就可以迭代應用通用操作到其所有元素的集合。同時,對元素的一些操作將取決於矢量或地圖類型。但是,我認爲所有的元素必須是相同的類型。

會有替代實現這樣的東西嗎?

+0

所以你想要一個'std :: set >'? –

+2

真的沒有意義。一個集合是有序的,這意味着你必須對矢量相對於地圖進行排序。 – MSalters

回答

2

不能將兩種不同類型的對象放入標準容器中。你必須做的是將容器「包裝」在另一個「知道」它實際上正在持有的對象的對象中。 boost::variant<T1, T2 ... >是一個相對標準的做法。如果你不能使用boost庫,那麼你會發現這樣的工作確定:

struct wrapper 
{ 
    int type; // or enum 
    union { 
     vector v; 
     map m; 
    } content; 
}; 
+1

注意代碼中的方法僅在C++ 11中有效,並且您將不得不向「wrapper」提供一些額外的代碼以使其工作(特別是將union設置爲引用一種類型或另一種類型需要調用合適的構造函數/析構函數,以避免內存泄漏 –

+0

感謝boost :: variant建議。我想我將首先嚐試使用單嵌套類型的boost-less方法,然後再深入探索boost。 –

1

你所試圖做的是沒有真正的語言支持,雖然你可以把它的工作,它不會簡單或優雅。 sftrabbit提出的方法(一旦你修正了語法:))可以讓你在那裏一半,但迭代將需要創建一個訪問者,可能需要一個函數來應用於元素;要能夠使用它在一個有序的容器內,你將需要將它包裝成一種類型,以提供訂購...

您的預期設計的另一個問題是,std::set不允許修改嵌套元素,基本上意味着一旦將容器添加到std::set中,它們就會變得不可變。如果沒有問題,您可以採取不同的方法,只需保留std::vector<ElementType*>以指向之後的所有現有元素納入外部std::set。這將讓你在所有元素上以更簡單的線性方式進行迭代。

一種更簡單的解決方案可以被創建類,取代了外部容器和內部保持兩個不同的std::set(再次假定不變性不是問題,或者如果需要不同的容器),一個用於每個嵌套容器:

class Container { 
    std::set<std::vector<Type>> d_vectors; 
    std::set<std::map<Key,Type>> d_maps; 
... 

然後Container類型可以包含遍歷內部容器的函數。

然後,你可能會想重新回顧一下原來的問題,並發現有一些簡單的方法不需要它,而且可能更乾淨。

+0

感謝您的支持因爲我的小項目的主要目標是學習,所以我將首先重新討論問題並使用單個嵌套類型 然後,我可能會嘗試boost ::變種方法。 –