Closed GoogleCodeExporter closed 9 years ago
Original comment by anna.sav...@phystech.edu
on 9 Mar 2013 at 8:03
0. Warnings:
TVector.cpp: In function ‘int main()’:
TVector.cpp:159: warning: comparison between signed and unsigned integer
expressions
TVector.cpp: In member function ‘void TVector<T>::PrintStat(int) [with T =
int]’:
TVector.cpp:144: instantiated from here
TVector.cpp:38: warning: comparison between signed and unsigned integer
expressions
TVector.cpp: In member function ‘TVector<T>&
TVector<T>::operator=(TVector<T>&) [with T = int]’:
TVector.cpp:149: instantiated from here
TVector.cpp:135: warning: comparison between signed and unsigned integer
expressions
TVector.cpp: In member function ‘void TVector<T>::resize() [with T = int]’:
TVector.cpp:106: instantiated from ‘void TVector<T>::push_back(T) [with T =
int]’
TVector.cpp:146: instantiated from here
TVector.cpp:67: warning: comparison between signed and unsigned integer
expressions
1. Зачем итератор на начало и на конец
хранить в полях? Их вычисление ничего не
стоит. А так Вам необходимо поддерживать их
значения актуальными - место, где легко
сделать ошибку.
И зачем эти поля делать public? У Вас ведь
методы чтения этих полей. А если поля в public,
то их можно неконтролируемо менять извне
объекта.
2. В условии задания сказано, что методы
получения итераторов на начало/конец
должны называться begin/end (как в STL). Это
возможно, т.к. в С++ методы с разной
константностью считаются методами с
разной сигнатурой, а значит их можно
перегружать.
3. Конечному пользователю не интересен Ваш
отладочный вывод. Обычно эту проблему
решают включением отлачного вывода в
условную компиляюцию:
#ifdef DEBUG_MESSAGES
cout << "achtung!" << endl;
#endif
А в начале программы добавляем:
#define DEBUG_MESSAGES
4. Метод resize у Вас делает что-то не то. Он
должен принимать число - размер вектора, - и
изменять размер. Если переданное число
меньше размера вектора - просто уменьшаем
Size. Если больше - увеличиваем Size (при
необходимости делаем перевыделение
памяти) и заполняем новые элементы
объектами, созданными конструктором по
умолчанию.
5. У Вас либо ошибка в clear(), либо Вы неверно
интерпретируете итератор на конец. Ведь
если вектор пустой, begin() и end() должны
совпадать.
6. Не вижу константную версию operator[].
7. Нет константных версий back() и front().
8. Не вижу проверок на утечки памяти.
9. Невозможно менять значения элементов
вектора.
Original comment by aivyu...@gmail.com
on 18 Mar 2013 at 8:22
Original comment by anna.sav...@phystech.edu
on 19 May 2013 at 8:35
Реализовывать метод swap, который делает то
же самое, что и стандартная функция swap
(меняет местами, копируя объект во врем
переменную), не имеет никакого смысла.
Вся фишка в том, что метод TVector::swap должен
работать за O(1), а Ваша версия работает как
обычный std::swap - за O(n). Имеется в виду
сложность относительно кол-ва элементов в
векторе, конечно.
В остальном все хорошо. Исправьте swap и
задача будет принята.
Original comment by aivyu...@gmail.com
on 19 May 2013 at 10:28
Original comment by anna.sav...@phystech.edu
on 19 May 2013 at 1:55
Решение принято.
Original comment by aivyu...@gmail.com
on 19 May 2013 at 2:49
Original issue reported on code.google.com by
anna.sav...@phystech.edu
on 8 Mar 2013 at 9:37