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

+1

Массивы имеют постоянный размер, вы не можете его изменить. Что сокращается? По каким критериям? – GManNickG

+0

Ваше использование термина «уменьшить» должно быть определено лучше. Я имею в виду, что вы можете написать такую ​​функцию, в которой есть всевозможные контейнеры STL, но проблема, которая будет решена на самом деле, будет принимать решения. ИМХО, не имеет смысла [уменьшать-как-в-карте/уменьшить] (http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29) массив longs в int, тем более что операция не определена. –

ответ

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::map<INT32,INT32> mymap; 
mymap[i] = array[i];//inserts if not already present 
+3

Если значение ключа ==, используйте std :: set, а не std :: map. Вы можете создать это, выполнив std :: set foo (массив, массив + размер); –

+0

Да, набор лучше для этой проблемы. – user122302

Смежные вопросы