2014-12-07 66 views
2

這將排序的矢量內載體:遞歸排序矢量的最簡單方法是什麼?

std::vector< 
    std::vector<int> 
> my_vector { 
    { 1, 3, 2 }, 
    { 52, 10, 20 }, 
    { 30, 2, 3 } 
}; 
std::for_each(my_vector.begin(), my_vector.end(), [] (std::vector<int>& v) 
    { 
     std::sort(v.begin(), v.end()); 
    }); 

實際上它並不最外矢量的元素進行排序,因此它不是一個「遞歸」的排序。遞歸排序會對所有向量進行排序,包括最外面的向量。例如,prettyprint.hpp將遞歸地打印容器。我不需要查看每個容器的所有元素,比如prettyprinter,只有範圍。

這是我嘗試迄今:

template <typename T> 
void my_sort(std::vector<T>& v) 
{ 
    std::sort(v.begin(), v.end()); 
    std::for_each(v.begin(), v.end(), 
     [] (T& vv) 
     { 
      my_sort(vv); 
     }); 
} 

這不起作用,因爲當T = int它試圖調用my_sort與詮釋。有小費嗎?

輸出應該是這樣的:

[[1, 2, 3], [2, 3, 30], [10, 20, 52]] 
^--- outermost vector 
^---- inner vector
+0

您是否試過模板專精? – 2014-12-07 15:56:52

+2

「它實際上沒有對最外層向量的元素進行排序」 - 最外層向量元素*是向量*。 *準確地* *你希望得到的最外面的向量看起來像給你的原始來源,並且在問題*中這樣做*;不在評論中。 – WhozCraig 2014-12-07 15:57:40

+0

你現在可以帶走downvote嗎?謝謝。 – user4334484 2014-12-07 16:04:59

回答

4

首先,你應該先遞歸,然後才進行排序外範圍。否則,你會得到一些隨機的結果,因爲內部容器沒有任何規範的順序。更糟糕的是,後面的排序會改變導致外部向量明顯失序的元素順序。似乎你想要有條件版本my_sort()取決於T類型是否定義了一個關聯的iterator類型。既然你只使用std::vector<T>秒的更簡單的方法是簡單地依靠模板部分排序,但:

template <typename T> 
void my_sort(T const&) { 
    // this function delibarately does nothing 
} 
template <typename T> 
void my_sort(std::vector<T>& v) { 
    std::for_each(v.begin(), v.end(), [](T& value) { my_sort(value); }); 
    std:sort(v.begin(), v.end()); 
} 

順便說一句,因爲這個功能實際上從來沒有稱自己不會直接或間接的,它實際上不是一個真正的遞歸函數:函數模板的每個實例都是不同的函數。

相關問題