привет, дружыщща! изучаю прекраснейшую книгу "Эффективное программирование на С++: практическое программирование на примерах" авторов Эндрю Кёниг и Барбары Му (серия C++ In Depths). даже не ожидал что книга окажется для меня настолько полезной, теперь многое стало яснее в мире С++, но вот наткнулся я на одну небольшую то ли опечатку, то ли ошибку по небрежности, причем, оная бага в книге фигурирует как минимум 2 раза. вот пример кода ф-ции из книжки, которая высчитывает медиану от vector<T>: Код (Text): template<class T> T median(vector<T> v) { typedef typename vector<T>::size_type vec_sz; vec_sz size = v.size(); if (size == 0) throw domain_error("Медиана пустого вектора"); sort(v.begin(), v.end()); vec_sz mid = size/2; return size % 2 == 0 ? (v[mid] + v[mid1]) / 2 : v[mid]; } (cтр. 173, хотя такой же косячок и на стр. 72) непонятный момент в последней строчке - что это за переменная mid1 и откуда она взялась? видимо имелось ввиду v[mid +1]. я прав или нет?
varnie Если размер вектора нечетный, то берется среднее двух значений, находящихся "по обе стороны" середины - я так думаю, что (v[mid] + v[mid-1])/2 (поскольку нумерация элементов вектора идет с 0).
varnie непонятный момент в последней строчке - что это за переменная mid1 и откуда она взялась? Видимо действительно опечатка, имеется в виду v[mid-1]. crypto немного опередил
crypto, да, я понял саму логику ф-ции, согласен. да, v[mid-1], а не v[mid+1]. ну, значит действительно опечатка
Great Нет, не хочу. Меня и мой вполне устраивает. Просто интересно, что означает статус "партизан дзена".
crypto Это что за дан такой ("Партизан дзена")? Ну уж какой получился Должен выражать мою неспособность действовать в составе регулярного воинства дзена и приверженность партизанской тактике.
еще раз всем привет. читаю далее вышеупомянутую книгу, и натыкаюсь на след: Код (Text): template <class T> class Vec { public: typedef T* iterator; typedef const T* const_iterator; typedef size_t size_type; typedef T value_type; typedef T& reference; typedef const T& const_reference; Vec() { create(); } explicit Vec(size_type n, const T& val = T()) { create(n, val); } size_type size() const { return limit - data; } T& operator[](size_type i) { return data[i]; } const T& operator[](size_type i) const { return data[i]; } private: iterator data; iterator limit; }; мне интересно, почему в subscript operator "[]" не производится проверка на границы, ведь по заведомо некорректному size_type i в data может находиться мусор? или я промахнулся и все нормально?
maxdiver, вас понял. но в других источниках в подобных реализациях эта проверка как раз таки и была, вот я и подумал...