如何使用C++編寫一個模板,可以同時適用於數組和vector<int>類型且避免數據的複製?
01-06
主要是想編寫一個排序函數,函數對一個數組或者vector容器的數據經行排序,在原數據上修改,避免數據的複製。
因為數據的形參太特別,題主利用引用或者指針傳遞實參總會出現衝突(不能同時滿足數組和vector),是否有辦法利用模板解決這個問題?謝謝。
不是有迭代器嗎?這也是為什麼,演算法是配合迭代器工作的而不是容器。
我更同意 @空明流轉 的答案,雖然 @陳碩 的答案直接符合原題。為什麼一定要統一到一種調用形式呢?直接用兩種方式調用 std::sort( ) 就行了。統一成一種形式來 cipher code,有好處嗎?題主把好處說說我們討論一下。
void sort(vector&
{
std::sort(x.begin(), x.end());
}
template& 為什麼一定要用模板?用重載不行嗎?
void sort(int (x)[N])
{
std::sort(x, x+N);
}
std::sort就可以,你vector就傳迭代器。數組的話,數組的首地址就是迭代器的begin,數組首地址加上數組長度作為迭代器的end。
排序函數使用迭代器作為參數,
有全局的std::begin和std::end,這個可以自動推導數組和vector
可以參考STL中迭代器的構造方式。
STL源碼剖析中詳細介紹了構造的思路和方法,基本上就是一步步引導的方式,推薦閱讀:
1. 首先直接封裝指針作為迭代器,2. 發現無法獲取類型信息,然後嘗試了增加模版參數利用參數推導來做,3. 然後發現這樣無法在返回值中應用這個模版推導的特性,4. 然後使用了在類中聲明類型的做法,5. 接著講了trait技法:使用部分特化來處理原生指針和const指針的情況。
用迭代器寫,然後你會發現你怎麼寫都不如std::sort,最後跑去用std::sort。
讓我抖個機靈,咦,這個算抖機靈么,不過這樣封裝好像沒什麼用的樣子……template&
void mysort(T arr)
{ std::sort(std::begin(arr), std::end(arr));}不明白lz在說什麼……
Vector和數組基本上可以等價,不明白你說的問題。
推薦閱讀:
※C++獲取數組長度只返回1?
※構造函數不能是虛函數?
※C++ 對象是如何完成成員函數的調用的?
※vs2013 有必要 使用 visual assist或resharper嗎?
※如何閱讀protobuf源碼?