Здравствуйте 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;
}
С точки зрения вызывающей функции данные не изменяются, а на самом деле нам удобно подменить последний элемент массива, так что бы на нем всегда положительно проходила проверка на совпадение. Таким образом в проверке на достижение конца массива больше нет необходимости.
Если цикл выполняется довольно много раз, то можно получить выигрыш в скорости в несколько ассемблерных команд на один цикл.