2017-02-22 46 views
1

排序時在C矢量++,你可以使用STL爲:爲什麼沒有的std ::排序(矢量<T>&)

std::sort(vec.begin(), vec.end()); 

由於這是很常見的用法(即提供開始和結束迭代器)我不知道爲什麼沒有那種超載這將接受的載體如參考:

template <typename T> 
void sort(vector<T>& vec) 
{ 
    std::sort(vec.begin(), vec.end()); 
} 
+2

可能是因爲他們必須爲每個容器定義一個,更可能是'T&vec'而不是'vector &vec'在任何容器上工作 – immibis

+3

這是部分Ranges TS有一個'Range'概念,它可以用來約束你可以排序的類型,在這種情況下,它實際上有一個'Sortable'的概念,它對普通的'Range'有一些額外的要求。 – chris

+2

Your函數不能用於我的'vector '。Boo。 –

回答

1

其分成算法標準庫的當前設計,數據結構和迭代器有一些很不錯的概念性含義:算法只經營在迭代器上,從不在容器上。這意味着算法本身無法使迭代器失效,並且所有迭代器失效通過容器修改來實現,必須明確地進行。

例如,這是爲什麼刪除 - 刪除需要兩個組件:一個序列的非無效重排,然後是一個容器操作以收縮容器。此外,並非所有的範圍都來自容器,所以用迭代器來表達算法在精神上更接近於在抽象「範圍」上操作,而不是在包含範圍的具體事物上操作。

當然還有爲複雜原始的參數:通過表達在迭代器方面都算法和容器,該庫需要O(中號 + Ñ)組件,其中中號是算法和數N容器的數量,而如果每個容器有一個算法,則需要O(MN)組件。是的,你可以使用模板,但完全不受約束的模板(例如template <typename T> void sort(T&)具有非本地影響,並且約束模板是困難和微妙的(例如,對任何需要與enable_if一起工作或面對其用戶,或試圖添加「概念」到C++)