2015-01-05 131 views
2

我想正確學習C++。我開始考慮的一個問題是如何正確地使模板功能成爲正確類型的容器。一個例子是實現合併排序。爲了避免在爲遞歸步驟將對象分割成兩半時需要創建一個容器的副本,我想使用迭代器。這意味着,我需要有以下形式的合併功能:返回正確的容器類型

template<typename ForwIt, typename Comparator> 
... merge(ForwIt begina, ForwIt enda, ForwIt beginb, ForwIt endb, Comparator comp) 
{ 
    Container foo; 
    ... 
    return foo; 
} 

我的問題:

  1. 如何定義,在一個習慣的方法正確的返回類型的功能?

  2. 我應該如何替換「容器」類型,以便它是與要合併的組件相同的容器的實例? (我這裏假設兩個參數合併是迭代器相同類型的容器)

一般情況下,如何使代碼清潔和高效的可能嗎?

+1

@ JT1:請注意,幾乎沒有任何算法與容器有任何關係。我應該能夠通過20元素矢量的第10個元素排序第5個元素,沒問題。 –

回答

4

看標準std::merge

template< class InputIt1, class InputIt2, class OutputIt > 
OutputIt merge(InputIt1 first1, InputIt1 last1, 
       InputIt2 first2, InputIt2 last2, 
       OutputIt d_first); 

標準的方式做,這是通過一個(輸出)迭代器,你的函數將寫入結果。在std::merge的情況下,它還將迭代器返回到複製的最後一個元素之後的元素

容器的標準算法將迭代器作爲參數,當它們返回某些內容時,它們將返回迭代器。他們從來都不是「容器意識」。

+0

啊,就是這樣。我無法弄清楚如何在不考慮其大小的前提下使用迭代器進行存儲。看起來像std :: back_inserter是使這種方法工作的謎題的缺失部分。 – JT1