divyang4481 / mipt-hw

Automatically exported from code.google.com/p/mipt-hw
0 stars 0 forks source link

task01_TVector (Савинова) #183

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
/savinova_anna/task01_Tvector/

Original issue reported on code.google.com by anna.sav...@phystech.edu on 8 Mar 2013 at 9:37

GoogleCodeExporter commented 9 years ago

Original comment by anna.sav...@phystech.edu on 9 Mar 2013 at 8:03

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago

Original comment by anna.sav...@phystech.edu on 19 May 2013 at 8:35

GoogleCodeExporter commented 9 years ago
Реализовывать метод swap, который делает то 
же самое, что и стандартная функция swap 
(меняет местами, копируя объект во врем 
переменную), не имеет никакого смысла.

Вся фишка в том, что метод TVector::swap должен 
работать за O(1), а Ваша версия работает как 
обычный std::swap - за O(n). Имеется в виду 
сложность относительно кол-ва элементов в 
векторе, конечно.

В остальном все хорошо. Исправьте swap и 
задача будет принята.

Original comment by aivyu...@gmail.com on 19 May 2013 at 10:28

GoogleCodeExporter commented 9 years ago

Original comment by anna.sav...@phystech.edu on 19 May 2013 at 1:55

GoogleCodeExporter commented 9 years ago
Решение принято.

Original comment by aivyu...@gmail.com on 19 May 2013 at 2:49