Я добавляю «шаблонную функцию, не являющуюся членом» в файл .h. Почему моя программа ничего не выводит после добавления кода ниже: - PullRequest
0 голосов
/ 14 апреля 2020

// эта функция принимает два аргумента: вектор типа Ve c и элемент типа T и возвращает // количество элементов, которые соответствуют аргументу и были успешно удалены из вектора. // Порядок остальных элементов должен оставаться неизменным.

// Я добавил это в файл .h и попытался вызвать эту функцию из теста. 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 Ответ

1 голос
/ 14 апреля 2020
  while(i < v.size()-1){
    v[i] = v[i+1];
  }

Поскольку нигде здесь i не увеличивается, вывод неизбежен: если в начале i меньше v.size()-1, оно останется таковым навсегда, пока наше солнце не сгорит, в бесконечности l oop: i здесь никогда не меняется, поэтому остается навсегда меньше v.size()-1. И именно поэтому вы не получаете вывод.

Кажется, это не единственная ошибка. Показанный алгоритм, по-видимому, имеет недостатки, по меньшей мере, еще одним способом и не будет надежно удалять дубликаты, по меньшей мере, в одном краевом случае. Но это был бы другой вопрос.

Библиотека C ++ имеет несколько функций алгоритма, которые позволяют делать все это в одной строке; но я предполагаю, что это классное задание, чтобы сделать это вручную. Вы должны переосмыслить свой подход на основе итераторов, что сделает эту реализацию намного проще и надежнее.

...