"Эффективное программирование на С++": опечатка или что?

Тема в разделе "WASM.BOOKS и WASM.BLOGS", создана пользователем varnie, 1 окт 2007.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    привет, дружыщща!

    изучаю прекраснейшую книгу "Эффективное программирование на С++: практическое программирование на примерах" авторов Эндрю Кёниг и Барбары Му (серия C++ In Depths). даже не ожидал что книга окажется для меня настолько полезной, теперь многое стало яснее в мире С++, но вот наткнулся я на одну небольшую то ли опечатку, то ли ошибку по небрежности, причем, оная бага в книге фигурирует как минимум 2 раза. вот пример кода ф-ции из книжки, которая высчитывает медиану от vector<T>:

    Код (Text):
    1. template<class T>
    2. T median(vector<T> v)
    3. {
    4.     typedef typename vector<T>::size_type vec_sz;
    5.    
    6.     vec_sz size = v.size();
    7.     if (size == 0)
    8.         throw domain_error("Медиана пустого вектора");
    9.    
    10.     sort(v.begin(), v.end());
    11.    
    12.     vec_sz mid = size/2;
    13.    
    14.     return size % 2 == 0 ? (v[mid] + v[mid1]) / 2 : v[mid];
    15. }
    (cтр. 173, хотя такой же косячок и на стр. 72)

    непонятный момент в последней строчке - что это за переменная mid1 и откуда она взялась? видимо имелось ввиду v[mid +1].
    я прав или нет?
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    varnie
    Если размер вектора нечетный, то берется среднее двух значений, находящихся "по обе стороны" середины - я так думаю, что (v[mid] + v[mid-1])/2 (поскольку нумерация элементов вектора идет с 0).
     
  3. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    varnie
    непонятный момент в последней строчке - что это за переменная mid1 и откуда она взялась?

    Видимо действительно опечатка, имеется в виду v[mid-1].

    crypto

    немного опередил :)
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Stiver
    Оффтоп
    Это что за дан такой ("Партизан дзена")? :)
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    crypto,
    да, я понял саму логику ф-ции, согласен. да, v[mid-1], а не v[mid+1].
    ну, значит действительно опечатка:)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    тоже хочешь статус себе чтоль?)
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Great
    Нет, не хочу. Меня и мой вполне устраивает. Просто интересно, что означает статус "партизан дзена".
     
  8. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Наверняка переводчики накосячили.
     
  9. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    crypto
    Это что за дан такой ("Партизан дзена")? :)

    Ну уж какой получился :) Должен выражать мою неспособность действовать в составе регулярного воинства дзена и приверженность партизанской тактике.
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    еще раз всем привет. читаю далее вышеупомянутую книгу, и натыкаюсь на след:

    Код (Text):
    1. template <class T> class Vec {
    2. public:
    3.     typedef T* iterator;
    4.     typedef const T* const_iterator;
    5.     typedef size_t size_type;
    6.     typedef T value_type;
    7.     typedef T& reference;
    8.     typedef const T& const_reference;
    9.    
    10.     Vec() { create(); }
    11.     explicit Vec(size_type n, const T& val = T()) { create(n, val); }
    12.     size_type size() const { return limit - data; }
    13.    
    14.     T& operator[](size_type i) { return data[i]; }
    15.     const T& operator[](size_type i) const { return data[i]; }
    16.    
    17. private:
    18.     iterator data;
    19.     iterator limit;
    20. };
    мне интересно, почему в subscript operator "[]" не производится проверка на границы, ведь по заведомо некорректному size_type i в data может находиться мусор? или я промахнулся и все нормально?:)
     
  11. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    varnie
    Вектор не обязан в [] проверять на границы. А вот at() обязан.
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    maxdiver,
    вас понял. но в других источниках в подобных реализациях эта проверка как раз таки и была, вот я и подумал...