標籤:

如何使用C++編寫一個模板,可以同時適用於數組和vector<int>類型且避免數據的複製?

主要是想編寫一個排序函數,函數對一個數組或者vector容器的數據經行排序,在原數據上修改,避免數據的複製。

因為數據的形參太特別,題主利用引用或者指針傳遞實參總會出現衝突(不能同時滿足數組和vector),是否有辦法利用模板解決這個問題?

謝謝。


不是有迭代器嗎?這也是為什麼,演算法是配合迭代器工作的而不是容器。


我更同意 @空明流轉 的答案,雖然 @陳碩 的答案直接符合原題。

為什麼一定要統一到一種調用形式呢?直接用兩種方式調用 std::sort( ) 就行了。統一成一種形式來 cipher code,有好處嗎?題主把好處說說我們討論一下。


void sort(vector& x)
{
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源碼?

TAG:C | 模板C |