2010-07-16 66 views
1

對於HW分配,我們是編碼一個減少例程,看起來像:STL,減少陣列,C++

int reduce(long array[], int size) 
//Where array is the array to reduce, and size is the size of the array. 

使用STL。我最初的想法是創建一個集合,通過比較將所有項目放在集合中,但後來我意識到我創建的集合將永遠不可用,因爲該函數會返回新集合的大小,但不會將集合本身使用。所以我不確定如何使用STL來減少數組。有什麼想法嗎?謝謝。

編輯: 對不起,減少只是將數組減少到排序數組沒有重複。

E.g. {4, 4, 2, 1} -> {1, 2, 4} 
+7

你是什麼意思的「減少」? – AraK 2010-07-16 16:52:24

+1

數組的大小不變,您無法更改它。什麼是減少?按什麼標準? – GManNickG 2010-07-16 16:53:13

+0

您對「減少」一詞的使用應該更好地定義。我的意思是,你可以編寫這樣一個有各種「STL」容器的函數,但要解決的問題確實會推動決策。恕我直言,它沒有任何意義[減少在地圖/減少](http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29)一個long數組到一個int,特別是作爲操作未定義。 – 2010-07-16 16:54:52

回答

8

使用std :: sort對數組進行排序,然後對其應用std :: unique以刪除重複項。 std :: unique僅適用於已排序的數組。只是爲了簡化這裏的問題是你如何得到begin和本地陣列的end

long* begin = array; 
long* end = array + size; 

一旦你有了這兩樣東西,你可以很容易地應用標準算法。另外,如果你需要返回新的大小(數組中使用的元素):

long* end_after_unique = unique(...); 
return end_after_unique - array; 
0

的std ::地圖只允許一個單一的入口,將物品自動爲您進行排序。你的情況中的「第二」價值是一個不關心。

std::map<INT32,INT32> mymap; 
mymap[i] = array[i];//inserts if not already present 
+3

如果鍵==值,則使用std :: set,而不是std :: map。你可以通過std :: set foo(array,array + size)來創建它。 – 2010-07-16 17:33:29

+0

是的,設置更適合這個問題。 – user122302 2010-07-16 20:22:57