Re: Изменение константы
От: Anton V. Kolotaev  
Дата: 12.05.02 13:28
Оценка: 7 (2)
Здравствуйте MikaRSDN Soukhov, Вы писали:

MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает

MS> Заранее благодарю

Рассмотрим функцию, которая ищет заданное значение в массиве


template <class T>
   bool  test (const T *begin, const T *end, T x)
{
    while (begin != end)
        if (*begin++ == x)
            return true;
    return false;
}


На каждой итерации совершается два сравнения: на достижение конца массива и на совпадение элементов. От первого сравнения можно избавиться следующим образом.

    //   вспомогательный класс, который предназначен для
    //   локализации "cнятия const".
    template <class T>
        class SubstLock
    {
        const T         _value;
        const T * const _ptr; 
    public:
        SubstLock (const T * p, const T& v)
            :   _value (*p)
            ,   _ptr   (p)
        {
            *const_cast<T*>(_ptr) = v;
        }

        ~SubstLock() 
        {
            *const_cast<T*>(_ptr) = _value;
        }
   };

   template <class T>
       bool test (const T *begin, const T *end, T x)
   {
       if (begin != end)
       {
           {
               SubstLock <T>  __(end-1,x);
               while (*begin++ != x);
               if (begin != end-1) return true;
           }
           return end[-1] == x;
       }
       return false;
   }


С точки зрения вызывающей функции данные не изменяются, а на самом деле нам удобно подменить последний элемент массива, так что бы на нем всегда положительно проходила проверка на совпадение. Таким образом в проверке на достижение конца массива больше нет необходимости.
Если цикл выполняется довольно много раз, то можно получить выигрыш в скорости в несколько ассемблерных команд на один цикл.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.