2016-09-12 5 views
-3

Реализовать функцию под названием находку, которая принимает в качестве параметров (в указанном порядке):Templated Линейный поиск

Объект мы хотим найти в массиве динамический массив любого типа Размер массива Эта функция должна выглядеть внутри массива для указанного элемента и возвращать позицию индекса элемента. Если элемент не существует, функция должна возвращать -1.

Код, который у меня есть:

template<typename t> 
t find(t objectInArray, t *array, int arraySize) 
{ 
    array = new t[arraySize]; 

    for(int index = 0; index < arraySize; index++){ 
     if(array[index] == objectInArray){ 
     cout << index; 
     return index; 
     } 
    } 
    return -1; 
} 

Я побежал этот код в главном, используя междунар без шаблона, и он работает отлично. Я действительно озадачен тем, что не так с моим кодом.

+0

Пожалуйста, отправьте сообщение [mcve]. Кроме того, 1) почему вы возвращаете '-1'? Что, если тип, который вы ищете, это 'std :: string'? Это возвращаемое значение '-1' не будет компилироваться. 2) почему вы используете 'new []', тем самым создавая утечку памяти? – PaulMcKenzie

+0

Чтобы добавить, [std :: find] (http://en.cppreference.com/w/cpp/algorithm/find) делает это уже для вас. – PaulMcKenzie

+0

Я изменил свой возвращаемый тип функции 't' на' int'. Я должен возвращать индекс, если объект находится в массиве, иначе я должен возвращать -1, если объект не находится в массиве. – hicu0

ответ

1

Не переустанавливайте указатель. Удалите эту строку.

array = new t[arraySize]; 

Что вы хотите вернуть - это индекс. Поэтому тип возврата не должен быть t. Возвращает целочисленный тип.


Примечание стороны:

Вы, вероятно, сказали вашим учителем или вашей книги, чтобы создать динамический массив, используя new выражение. Возможно, вы написали одну в своей основной функции. Я должен указать, что это противоречит общей рекомендации сообщества в связи с опасностью утечки памяти, хотя у студентов обычно нет выбора. Если необходимо использовать new, не забудьте дать ему соответствующий delete.

+0

Вызов 'new' является утечкой памяти в коде OP. Это не должно быть сделано вообще. – PaulMcKenzie

+0

@PaulMcKenzie Я предполагаю, что добавление бокового примечания, адресованное, было бы замечательно. –

+0

Если я выберу строку 'array = new t [arraySize];' как я могу использовать для цикла, чтобы пройти через все элементы в массиве? – hicu0

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