2010-07-16 65 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