Я добавляю "шаблонную функцию, не являющуюся членом" в файл .h. Почему моя программа ничего не выводит после того, как я добавил код ниже:
// эта функция принимает два аргумента, вектор типа Vec и элемент типа T, и возвращает // количество элементов, которые соответствуют аргументу и были успешно удалены из вектора. // Порядок других элементов должен оставаться неизменным.
// Я добавил это в файл.h и попытался вызвать эту функцию из файла test.cpp со строками:
int num_ele = remove_matching_elements(v, 22);
cout << num_ele << endl;
// где v равно {11, 22, 33, 11, 55, 33}
template <class T> int remove_matching_elements(Vec<T>& v, const T& t) {
int counter = 0;
int i;
for(i = 0; i < v.size(); i++){
if(v[i] == t){
counter++;
while(i < v.size()-1){
v[i] = v[i+1];
}
v.resize(v.size()-1,0);
}
}
return counter;
}
1 ответ
while(i < v.size()-1){
v[i] = v[i+1];
}
Поскольку здесь нигде i
увеличивается, вывод неизбежен: если в начале i
меньше чем v.size()-1
, он останется как таковой навсегда, пока наше солнце не выгорит, что приведет к бесконечному циклу: i
здесь никогда не меняется, поэтому остается навсегда меньше, чем v.size()-1
. Вот почему у вас нет вывода.
Это не единственная ошибка. Показанный алгоритм кажется ошибочным по крайней мере в одном другом случае и не будет надежно удалять дубликаты, по крайней мере, в одном пограничном случае. Но это был бы другой вопрос.
В библиотеке C++ есть несколько функций алгоритмов, которые позволяют делать все это в одной строке; но я предполагаю, что это задание класса сделать это вручную. Вам следует переосмыслить свой подход, сделав его основанным на итераторах, что сделает эту реализацию намного проще и надежнее.