Я добавляю "шаблонную функцию, не являющуюся членом" в файл .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++ есть несколько функций алгоритмов, которые позволяют делать все это в одной строке; но я предполагаю, что это задание класса сделать это вручную. Вам следует переосмыслить свой подход, сделав его основанным на итераторах, что сделает эту реализацию намного проще и надежнее.

Другие вопросы по тегам